私が書いているプログラムでは、iostreamのtellgとseekg関数を使って計算するファイルサイズを計算すると便利ですが、-Wstack-protectorの警告が表示されます。istreamのtellg/seekgはスタックスマッシングから保護できません(g ++)?
#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);
}
グラム++(フラグ:-fstack-プロテクター-Wstackプロテクター、コンパイラのバージョン:4.4.3(Ubuntuの4.4.3-4ubuntu5)、システム:次のコードは、 "問題" を再現しますのUbuntu 10.04 x86_64の)が警告を与える:
f.cc:関数で 'のstd :: STREAMSIZE get_file_size(スタンダード::はifstream &)':
f.cc:12:警告:保護しない機能:少なくとも8バイトのバッファなしグラム
(私はGCC 4.5.2を使用する場合、私は同じ結果を得る、直接GNUからダウンロードしてコンパイル。)
は(一般的に、またはGCCによって)保護作品をスタックスマッシング方法から期待される。これは、どのようにifstreamとseekg/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);
}
は、(上記と同じスペックを)++グラムにつながる警告:
main.cc:関数 '無効F1(STD ::はifstream &')では:
main.cc:6警告:保護しない機能:無バッファ少なくとも8バイトの長
main.cc: 'ボイドF2(スタンダード::はifstream &)' 関数で:
main.cc:10警告:保護機能なし:少なくとも8バイト長のバッファなし
興味深いことに、f3
は警告をトリガーしません。
リンクをありがとう(私のプログラムビルドに-Wstack-protectorを含めるようなページを読んでいたと思うが)。私が 'get_file_size'にバッファを入れていないという事実は、私が質問した理由です:なぜ警告が出てくるのでしょうか?私が実際にそれを無視することができたとしても、私の利益のために、何が起こっているかについての知識をまだ好むだろう。 – Zorawar
@Zorawar実用的なバッファオーバーランのテクニックはそれほど良くありませんので、特定のスキルを持つ人がどのように悪用されるのかを説明するのを待たなければなりません) –
多分私「NSA Project Xヒューマノイド言語翻訳者」というファイルにコードを見つけたことに触れて参加を促すべきでしょうか? (ちょうどNSAの冗談だよ!それはMI6からだった...) – Zorawar