そう仮定する1は、機能があります:関数を呼び出すときにバッファのデータ型が一致しないと(int *とunsigned int *)どうなりますか?
int somefunc(int* buf)
が、我々はによってsomefuncを呼び出す:buf2
はタイプunsigned int
のデータを持っているalloca
によって割り当てられたヒープバッファを、(これbuf2
がであるポインタである
somefunc(buf2)
タイプunsigned int*
)。
これを行う危険性は何ですか?ここで何が問題になるでしょうか?私はこれがヒープ(バッファ)のオーバーフローと関係があるかもしれないと思うが、私はそれが何であるか分からない。コードには他にもいくつかの問題があるかもしれません。もしそうなら、私はこれらの問題についても知りたいと思っています。
コード例:ランダムファジングによって、私はオーバーフローの兆候を得ることができたが、私はオーバーフローが型の不一致によって発生する可能性がありますかわからないので、
void typecastfunc(FILE *p, int *buf, unsigned int index) {
unsigned int a;
for (a = 0; a < index; a++) {
if (fread(&buf[a], sizeof(unsigned int), 1, p) < 1) {
break;
}
}
}
void caller(char *filen) {
FILE *p = fopen(filen, "rb");
if (!p) {
return;
}
unsigned int index;
fread(&index, sizeof(unsigned int), 1, p);
unsigned int *buf = alloca(index * sizeof(unsigned int));
if (!buf) {
return;
}
typecastfunc(p, buf, index);
}
int main(int argc, char *argv[]) {
caller(argv[1]);
}
質問は、要求されています。他のコードは無害なので、型の不一致が原因であると想定しています。
[最小限で完全であり、検証可能な例](http://stackoverflow.com/help/mcve)を作成してください。 )私たちを見せてください。宣言*をコード*として表示します。 –
暗黙のキャストまたは変換が発生する可能性があります。暗黙的とは、通常、「詳細に計画されていない」ことを意味し、しばしば「望ましくない」ものになります。 intとunsigned intの間のキャスト/変換は、同じサイズで0-MAX_INTの範囲で同じセマンティクスがあるため、「しばしば動作します」。しかし、これらの「無害」は前提です。いずれかが適用されなくなると、問題をデバッグするのが難しくなります。それらのどれも公式に信頼できるものではありません。 – Yunnosch
@Someprogrammerdudeサンプルコードを提供しました。 – NCL