私の本ExpertCProgrammingを読んで、関数の介在と、それが意図せずに行われた場合にバグを見つけるのが難しい深刻な問題につながる可能性があるという章に出くわしました。
この本で与えられている例は次のとおりです。
my_source.c
mktemp() { ... }
main() {
mktemp();
getwd();
}
libc
mktemp(){ ... }
getwd(){ ...; mktemp(); ... }
この本によると、何が起こるかとmain()
いうと、mktemp()
(標準Cライブラリ関数)がmy_source.cの実装によって挿入されているということです。main()
私の実装を呼び出すことmktemp()
は意図された動作ですが、getwd()
(別のCライブラリ関数)も私の実装を呼び出すことは意図されmktemp()
ていません。
どうやら、この例は、SunOS4.0.3のバージョンのに存在した実際のバグでしたlpr
。この本は、my_source.cstatic
の定義にキーワードを追加することで修正されたことを説明しています。名前を完全に変更すると、この問題も修正されたはずですが。 mktemp()
この章では、未解決の質問をいくつか残しておきます。皆さんが答えてくれることを願っています。
- GCCには機能の介入について警告する方法がありますか?私たちは確かにこれが起こることを意図していません、そして私はそれが起こったらそれについて知りたいです。
static
私たちのソフトウェアグループは、公開したくないすべての機能の前にキーワードを配置するという慣習を採用する必要がありますか?- 静的ライブラリによって導入された関数で介入が発生する可能性はありますか?
助けてくれてありがとう。
編集
私の質問は、標準Cライブラリ関数だけでなく、他のライブラリ、おそらくサードパーティ、おそらく社内で作成されたライブラリに含まれる関数にも介入することを目的としていることに注意してください。基本的に、介在する関数がどこにあるかに関係なく、介在するインスタンスをキャッチしたいと思います。