下記の警告の解決方法がわかりません。
下記の解決方法が分からないので、ご教授お願い致します。
環境:Visual Studio 2017
発生している問題・エラーメッセージ
警告 C6385 'databuff' から無効なデータを読み取っています: 読み取り可能なサイズは 'unsigned int' バイトですが、'2' バイトを読み取る可能性があります。
該当のソースコード
int main() { int data_size = 100; char *databuff = new char[data_size](); for (int i = 0; i < data_size; ++i) { char a = databuff[i]; } }
試したこと
char a = databuff[i];の部分を、char a = *databuff++;にすると警告自体は消えましたが、理由を知りたいです。
こちらの環境では警告レベルを「警告をすべて有効にする (/Wall)」にしても C6385 は出ないようだが…?
↑ごめん,コード分析が無効になってただけだった.有効にしたら出た.
こちらも言葉足らずでした、コード分析中に発生した警告になります。
確証なく個人的な感想なので回答は控えますが
「C6385 false positive」なりで検索すると以下などが見つかりますので誤検知の可能性が高いと思います。
https://stackoverflow.com/a/59650055
https://developercommunity.visualstudio.com/t/false-positive-c6385-reading-invalid-data/1339954
ちょっといじってみた感じだと
> new char[data_size]();
ココの () があると C6385 が出てくるような? ( {0} とかに変えても同じ.)
() を取っ払うと「初期化されてない」って言われるけど,それじゃあ,ということで
char *databuff = new char[data_size];
for (int i = 0; i < data_size; ++i)databuff[i] = 0; //値を入れてやるぜ!
とかすると C6385 は出てこない様子.
あとは
inline char *Alloc( int s ){ return new char[s](); } //newをinline関数に移した
とかいうのを使う形にしたり,
std::vector<char> にしたりすれば出ないみたい.
返信遅れて申し訳ありません。
fanaさん色々お試しいただきありがとうございます。
()取ると警告でないことはこちらの環境でも確認できました。(んーこれなんか嫌ですね。。。)
can110さんもお調べ頂きありがとうございます。Microsoftもそこまで気にしてなさそうな感じなんですかね。。。
回答1件
あなたの回答
tips
プレビュー