ISTREAMのTellg/Seekgは、Stack Smashing(G ++)から保護できませんか?
質問
私が書いているプログラムの場合、ファイルサイズを計算するのが役立ちます。これは、iOSTREAMのTellgおよびSEEKG関数を使用して計算しますが、これにより-wstack -Protectorによる警告が発生します。次のコードは「問題」を再現します。
#include <iostream>
std::streamsize get_file_size(std::ifstream& ifs) { // line 12 (in warning, below)
const std::streamsize start = ifs.tellg();
ifs.seekg(0,std::ios::end);
const std::streamsize end = ifs.tellg();
ifs.seekg(start);
return (end-start);
}
G ++(フラグ: -fstack-protector -wstack-protector, 、コンパイラバージョン: 4.4.3(ubuntu 4.4.3-4ubuntu5), 、 システム: ubuntu 10.04 x86_64)警告を発します:
f.cc:infunction 'std :: streamsize get_file_size(std :: ifstream&)':
F.CC:12:警告:機能を保護しない:少なくとも8バイツの長さのバッファーなし
(GCC 4.5.2を使用して、GNUから直接ダウンロードしてコンパイルしたときに同じ結果が得られます。)
これは、Stack Smashing Protectionがどのように機能するか(一般的またはGCCによる)、および/またはIfstreamおよびSeek/Tellgの仕組みから予想されますか?もしそうなら、この警告を無視することはできませんか、それとも私にできることがありますか?
編集:
実際、上記のコードの一部は冗長です。何が起こっているのかを明確にするために:
#include <iostream>
void f1(std::ifstream& ifs) { // line 6
ifs.tellg();
}
void f2(std::ifstream& ifs) { // line 10
// call seekg(std::streampos)
ifs.seekg(0);
}
void f3(std::ifstream& ifs) {
// call seekg(std::streamoff, std::ios_base::seekdir)
ifs.seekg(0,std::ios::beg);
}
G ++(上記と同じ仕様)につながる警告:
main.cc:infunction 'void f1(std :: ifstream&)':
main.cc:6:警告:機能を保護しない:少なくとも8バイツの長さのバッファーなし
main.cc:infunction 'void f2(std :: ifstream&)':
main.cc:10:警告:機能を保護しない:少なくとも8バイツの長さのバッファーなし
興味深いことに f3
警告をトリガーしません。
解決
あなたは見ることがないかもしれません これ。
そして、一般的なアドバイスはです あなたは本当に気にするべきではありません, 、特にあなたの場合、バッファオーバーフロー攻撃を実行するために使用できる内部バッファを割り当てない場合。