MISRAリンカーを販売しているのは誰ですか?非常識なバグがあるようです。
int (*foo)(int) = tolower;
ファイルスコープでそのアドレスを取得することで回避できますか?
編集:私の理論的根拠は次
のとおりです。これは私がこの10年間に見た中で最も愚かなことなので、バグかもしれませんが、
b。エッジケース(グローバルを介して名前がエクスポートされたシンボル)に向かって押すと、シャットダウンする可能性があります。
それが正しい動作、つまりバグではないためには、initialise_system_timer、initialise_watchdog_timer、...などのライブラリ関数を一度含めるとMISRAエラーになる必要がありますが、これは頭を痛めるだけです。
編集:別の考え。これもエッジケースエラーであるという仮定に基づいています。
理論:たぶん、コンパイラーはインラインと関数の実装の両方を実行しています。その場合、関数は(もちろん)呼び出されません。したがって、リンカのルールは、呼び出されていない関数を認識しています。
GNUには、インライン化を防ぐためのオプションがあります。tolowerのその使用についても同じことができますか?それはエラーを変更しますか?あなたはによってテストを行うことができます
#define inline /* nothing */
ctype.hを含める前に、マクロの定義を解除します。
もう1つのテストは、次のことを定義することです。
#define inline static inline
私が期待するインラインのバージョンであるctype.hを含める前に。
EDIT2:報告すべきバグがあると思います。IARには回避策があると思います。私は彼らのアドバイスを聞きます。
夜寝た後、問題はまたはではinline int tolower()
なく、最も理にかなっているので、私は強く疑っています。呼び出されないパブリック関数を持つことは、プログラムのバグの兆候のようです。static inline int tolower
int tolower
ドキュメントがあっても、すべてのコーディングアプローチには欠点があります。
私はOPを強く支持します。標準のヘッダーファイルは変更しません。いくつかの理由があると思います。たとえば、ツールチェーンの将来のアップグレード(新しいヘッダーのセットが付属)は、古いアプリが維持された場合、それを壊します。または、単に別のマシンでアプリケーションを構築するとエラーが発生し、明らかに正しい2つのアプリケーションをマージするとエラーが発生する可能性があります...。それから良いことは何も起こりそうにありません。-100
#define ...
エラーを解消するために使用します。マクロを使用して標準ライブラリを変更するのは好きではありません。これは、長期的な悪い考えの種のようです。将来、プログラムの別の部分が同様の問題を持つ別の関数を使用する場合、「修正」の適用はさらに悪化します。#define
経験の浅い開発者の中には、コードを保守する仕事を得る人もいるかもしれません。奇妙なトリックの断片を「学ぶ」こと#include
は、「通常の」方法です。奇妙なマクロの回避策をラップ#include <ctype.h>
することは会社の「実践」になりますが、それは修正されてから何年も経っています。-20
コマンドラインコンパイラオプションを使用して、インライン化をオフにします。これが機能し、セマンティクスが正しい場合、つまりヘッダーを含めて2つのソースファイルで関数を使用しても、複数の定義された関数が作成されない場合は、問題ありません。エラーが発生する可能性がありますが、バグレポートの一部として確認する価値があります。それは、将来やってくる他の誰かに苛立たしい罠を仕掛けます。別の場合inline
標準ライブラリ関数が使用されており、何らかの理由で生成されたコードを確認する必要があり、コードも含まれていません。彼らは、なぜインラインが尊重されないのか疑問に思って少し頭がおかしくなるかもしれません。彼らが生成されたコードを見ている理由は、パフォーマンスが重要だからだと思います。私の経験では、人々はコードを見るのに多くの時間を費やし、動作するプログラムのビルドスクリプトを見る前に困惑していました。インラインの抑制を修正として使用する場合、1つのファイルよりもどこでもそれを行う方が良いと思います。少なくともセマンティクスは一貫しており、高レベルのコメントまたはドキュメントが注目される可能性があります。ビルドスクリプトを「クイックチェック」として使用する場合は、一貫した動作が得られ、ドキュメントを参照する可能性があります。-1(どこでもインラインなし)-3(1つのファイルにインラインなし)
2番目のソースファイルで偽の方法でtolowerを使用します。これには、ビルドシステムが追加のコンパイラオプションに「感染」しないという小さな利点があります。また、回避されているエラーを説明する機会を与える小さなファイルです。私はこれはあまり好きではありませんが、標準のヘッダーをいじるよりも好きです。私の現在の懸念は、それが機能しないかもしれないということです。リンカが解決できない2つのコピーが含まれている可能性があります。私はそれが奇妙なものよりも優れているのが好きです'そのアドレスを取り、リンカーがシャットダウンするかどうかを確認します`(これはエッジケースをテストするための興味深い方法だと思います)。-2
独自のtolowerをコーディングします。アプリケーションのより広いコンテキストを理解していません。私の反応は、ライブラリ関数のコード置換ではありません。テスト(およびさらに多くのコードを導入する単体テスト)と長期的なメンテナンスについて懸念しているからです。アプリケーションがUTF-8エンコーディングなどのより広い文字セットを処理できるようになる必要があり、ユーザー定義のtolowerが同期しなくなる傾向があるため、文字I/Oにはさらに神経質になります。それは非常に特殊なアプリケーション(ポートへのデバッグ)のように聞こえるので、私は対処することができました。特に商用ソフトウェアの場合、バグのように見えるものを回避するために余分なコードを書くのは好きではありません。-5
他のすべてのチェックを失うことなく、エラーを警告に変換できますか?それでもツールチェーンのバグだと感じているので、インシデントといくつかのドキュメントのフックがあり、別のエラーが忍び寄る可能性が少ないように、沈黙ではなく警告にすることをお勧めします。エラーをオフにしてください。+1(警告)0(エラー)
エラーをオフに切り替えると、(IMHO)IARが説明と長期的な修正を行う必要があるという「企業の認識」が失われるようですが、ビルドシステムをいじったり、標準ライブラリを使用してマクロの不快感をfutzに書き込んだりするよりもはるかに優れているようです。あなたのコストを増加させるあなた自身のコードを書くこと。
私だけかもしれませんが、商用製品の欠陥を回避するためのコードを書くのは嫌いです。これは、ベンダーがライセンスコストを正当化する機会を持つことを喜ばなければならない場所であるように感じます。マイクロソフトがインシデントの料金を請求したことを覚えていますが、問題が彼らのものであることが証明された場合、インシデントと修正は無料でした。正しいことは彼らにお金を稼ぐ機会を与えることのようです。製品にはバグがあるので、修正する機会を与えずに黙って回避することもあまり役に立たないようです。