ホームページ >バックエンド開発 >C++ >「printf」で間違ったフォーマット文字列を使用すると未定義の動作になるのはなぜですか?

「printf」で間違ったフォーマット文字列を使用すると未定義の動作になるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-17 22:03:02576ブラウズ

Why is Using Incorrect Format Strings in `printf` Undefined Behavior?

不正なフォーマット文字列による printf の予期しない動作

C プログラミングでは、printf 関数はフォーマットされた出力を印刷するための強力なツールです。ただし、フォーマット文字列の使用法を誤ると、予期しない結果が生じる可能性があります。

次のコード行を考えてみましょう:

#include <iostream>
#include <cstdio>

int main() {
    std::cout << sizeof(int) << std::endl
              << sizeof(long) << std::endl;

    long a = 10;
    long b = 20;
    std::printf("%d, %d\n", a, b);

    return 0;
}

このプログラムは通常、期待どおりの結果を生成しますが、実際には、その動作は未定義です。不正なフォーマット文字列で呼び出されました。 C99 標準 (7.19.6.1:9) に次のように記載されています:

変換仕様が無効な場合、動作は未定義です。いずれかの引数が対応する変換仕様の正しい型ではない場合、動作は未定義です。

この例では、形式文字列 "%d" は整数の引数を予期しますが、提供される引数は long 型です。この不一致により、誤った出力、クラッシュ、またはその他の予期しない動作が発生する可能性があります。

未定義の動作は、引数が間違っている場合に限定されないことに注意することが重要です。引数の型が正しい場合でも、無効な形式文字列を使用すると有害な結果が生じる可能性があります。たとえば、整数を出力するために "%s" (文字列) を使用すると、未定義の動作が発生する可能性があります。

したがって、printf を使用する前にフォーマット文字列を注意深くチェックし、それらが指定されている引数の型と一致していることを確認することが重要です。合格した。そうしないと、予期しない信頼性の低いプログラム動作が発生する可能性があります。

以上が「printf」で間違ったフォーマット文字列を使用すると未定義の動作になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。