質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3801閲覧

C6385の警告理由

sabotenman

総合スコア1

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2023/06/30 02:56

下記の警告の解決方法がわかりません。

下記の解決方法が分からないので、ご教授お願い致します。
環境: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++;にすると警告自体は消えましたが、理由を知りたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2023/06/30 03:14 編集

こちらの環境では警告レベルを「警告をすべて有効にする (/Wall)」にしても C6385 は出ないようだが…? ↑ごめん,コード分析が無効になってただけだった.有効にしたら出た.
sabotenman

2023/06/30 04:19

こちらも言葉足らずでした、コード分析中に発生した警告になります。
fana

2023/06/30 04:49 編集

ちょっといじってみた感じだと > 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> にしたりすれば出ないみたい.
sabotenman

2023/07/19 02:57

返信遅れて申し訳ありません。 fanaさん色々お試しいただきありがとうございます。 ()取ると警告でないことはこちらの環境でも確認できました。(んーこれなんか嫌ですね。。。) can110さんもお調べ頂きありがとうございます。Microsoftもそこまで気にしてなさそうな感じなんですかね。。。
guest

回答1

0

ベストアンサー

コンパイラの正確な判断規則は公表されていないのでコンパイラ開発に関わっている人でもなければ「理由」はわかりません。

警告のメッセージからの推測ですが data_size に入っている具体的な値 (100) を分析に使用していないものと思われます。 配列の要素数が 0 であることはあり得ないので最低限度である 1 であると仮定し、アクセスのときには 2 バイト目が読み取られる可能性があるという判断になっているのでしょう。

正しいプログラムに対してもコンパイラが正しいと確信できるほど分析しきれなかった場合に「可能性があります」という形で警告を出すことはあります。

警告を見た上で (コンパイラに判断しきれなくても) 正しく意図通りなプログラムなのであれば警告は無視して良いです。 警告を消すためだけに不必要な変形をするべきではありません。

投稿2023/07/01 01:30

SaitoAtsushi

総合スコア5675

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問