[解決済み] mallocの結果をキャストすることの何が危険なのでしょうか?
質問
さて、人々がこれをdupとマークし始める前に、私は以下のものをすべて読みました、どれも私が探している答えを提供していません。
- C FAQ。mallocの戻り値をキャストするのは何が問題なのですか?
- SOです。malloc()の戻り値を明示的にキャストすべきでしょうか?
- SOです。C 言語における不要なポインタキャスト
- SOです。malloc の結果をキャストするのですか?
C FAQと上記の質問に対する多くの回答の両方が、キャストすることによる謎のエラーを引用しています。
malloc
の戻り値をキャストすることで隠せるという不思議なエラーを挙げていますが、実際にはそのようなエラーの具体的な例はありません。 さて、私が言ったことに注目してください。
エラー
ではなく
警告
.
さて、次のようなコードが与えられました。
#include <string.h>
#include <stdio.h>
// #include <stdlib.h>
int main(int argc, char** argv) {
char * p = /*(char*)*/malloc(10);
strcpy(p, "hello");
printf("%s\n", p);
return 0;
}
上記のコードを gcc 4.2 でコンパイルすると、キャストの有無にかかわらず同じ警告が表示され、プログラムはどちらの場合も適切に実行され、同じ結果が得られます。
anon@anon:~/$ gcc -Wextra nostdlib_malloc.c -o nostdlib_malloc
nostdlib_malloc.c: In function ‘main’:
nostdlib_malloc.c:7: warning: incompatible implicit declaration of built-in function ‘malloc’
anon@anon:~/$ ./nostdlib_malloc
hello
というわけで、キャスティングが原因で発生する可能性のあるコンパイルエラーやランタイムエラーの具体的なコード例をどなたか教えていただけませんか?
malloc
の戻り値をキャストすることで発生する可能性のある、コンパイルや実行時のエラーの具体的なコード例をどなたか教えてください。
編集 この問題に関して、私は2つのよくできた議論に出会いました。
- キャスティングを支持する。CERT アドバイザリ。 メモリ割り当て関数呼び出しの結果を、割り当てられた型へのポインタに即座にキャストしてください。
- キャストに対して (2012-02-14現在、404エラー) インターネット・アーカイブ・ウェイバック・マシン からのコピー 2010-01-27.{2016-03-18:"Page cannot be crawled or display due to robots.txt."})
どのように解決するのですか?
を取得することはできません。
コンパイラーエラー
というエラーは出ませんが
コンパイラ警告
. あなたが引用したソースが言っているように(特に
最初のもの
) 、あなたは
ができる
は、予測できない
ランタイムエラー
キャストを使用した場合
を含まずに
stdlib.h
.
つまり、あなた側のエラーはキャストではなく、インクルードし忘れている
stdlib.h
. コンパイラは
malloc
を返す関数であると仮定します。
int
を返す関数であり、したがって
void*
が実際に返すポインタを
malloc
を
int
に変換され、その後、明示的なキャストによりポインタ型に変換されます。いくつかのプラットフォームでは
int
とポインタは異なるバイト数を取ることがあるので、型変換はデータ破損につながる可能性があります。
幸いなことに、最近のコンパイラーは実際のエラーを指し示す警告を出します。以下の
gcc
の出力を見てください。これは
暗黙の
宣言 (
int malloc(int)
) は、組み込みの
malloc
. そのため
gcc
は知っているようです。
malloc
がなくても
stdlib.h
.
このエラーを防ぐためにキャストを省くことは、ほとんど次のように書くのと同じ理由です。
if (0 == my_var)
の代わりに
if (my_var == 0)
を混同してしまうと重大なバグを引き起こす可能性があるため、後者は
=
と
==
であるのに対し、前者はコンパイルエラーになります。個人的には、後者のスタイルの方が私の意図をよく反映しているし、このような間違いをすることはあまりないので、後者のスタイルを好んでいます。
によって返される値をキャストする場合にも同じことが言えます。
malloc
: 私はプログラミングにおいて明示的であることを好みますし、一般的に、使用するすべての関数のヘッダーファイルをインクルードするようダブルチェックします。
関連
-
C 構造体定義エラー: '['トークンの前に一次式があることが予想される
-
error: '.' トークンの前にunqualified-idを指定する必要があります。
-
[C] Error [Error] 代入の左オペランドとして lvalue が必要です。
-
[解決済み] Windows用Cコンパイラ?[クローズド]
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み] 難読化Cコードコンテスト2006。sykes2.cの解説をお願いします。
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] .aファイル、.soファイルとは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Solve Dev-c++ [エラー] 'for' ループの初期宣言は、C99 または C11 モードでのみ許可されます。
-
initializer element is not constant "というエラーが表示されるのですが?
-
未定義の `__isoc99_sscanf' への参照
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
[解決済み] Windows用Cコンパイラ?[クローズド]
-
[解決済み] Linux Socket write() によるBad File Descriptor C
-
[解決済み] Linuxカーネルにおけるcontainer_ofマクロの理解
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] なぜ16進数には0xがつくのですか?
-
[解決済み] なぜこのコードは64ビットアーキテクチャでセグメンテーションされ、32ビットでは正常に動作するのですか?