pit-rayの備忘録

気づいたことや調べたことをまとめていくブログ

インライン関数はヘッダファイルで実装する

インライン関数はC++やC99以降のC言語でサポートされています。
インライン関数はマクロ関数のようにオーバヘッドを避けることができます。

インライン関数の書き方の例はこのようになります。

inline int Five() {
    return  5 ;
}

マクロ関数で実装する場合はこのようになります。

#define Five() 5

しかし、マクロは未定義の動作を引き起こす可能性があります。
この件に関する詳しいことは以下を参照してください。
PRE00-C. 関数形式マクロよりもインライン関数やスタティック関数を使う



今回話したいのはインライン関数の定義が利用時点で不明のとき、通常の関数として扱われるということです。

つまり、定義をcppファイルに書き、宣言をhファイルでするとコンパイル後にcppファイルをリンクするため、通常の関数として扱われます。

インライン展開はマクロ展開と同じように処理中に埋め込んだ形になるので、ヘッダファイルに書くのです。

<今回のまとめ>
インライン関数はヘッダファイルに実装する



<参考文献>
インライン展開がどう展開されるのかを調べた | おおたの物置
c++ - inline関数の実装はヘッダファイルでというのは何故? - スタック・オーバーフロー
C++ インライン関数 書いて覚えるための初心者自己中記事 - C++ 書いて覚えるための初心者自己中記事


何か本記事に不備等ありましたら、お気軽にご指摘ください。
間違った情報発信防止にご協力してくださると幸いです。

では失礼します ノ

<C言語>解放後のポインタにNULLを代入するべき(ダングリングポインタ)

今回題材とするのはダングリングポインタ(dangling pointer)です。
ここで出てくるdanglingというのはぶら下がるという意味で、ポインタがどこのメモリを指しているのかわからない状態を指します。

ダングリングポインタは攻撃ができる脆弱性につながる可能性があります。
そのため、プログラムのセキュリティを向上させるために今一度確認してみてください。

今回特に取り上げるのはfree関数で解放したポインタに関するものです。
free関数で解放したポインタというのはどこのメモリを指しているのかわからない状態、つまり、ダングリングポインタになっています。

対策としてはそこまで大変ではなく、free関数の後に開放したポインタにNULLを代入し、ヌルポインタにするだけです。これで、ダングリング状態から外れます。

ここで、ダングリングポインタで危険なのは解放済みのメモリにアクセスするということであるため、free関数直後にreturnで値を返す場合は特にNULLにしなくても大丈夫です。



<まとめ>
解放したポインタにアクセスする可能性があるときはNULLを代入する

<参考文献>
MEM01-C. Store a new value in pointers immediately after free() - SEI CERT C Coding Standard - Confluence
MEM30-C. Do not access freed memory - SEI CERT C Coding Standard - Confluence