Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@7of9

C++ Builder XE4, 10.2 Tokyo > NULLに対して.IsEmpty()を使うのは良くない | Indy: IdUDPClient1->ReceiveString()の戻り値がNULLの場合がある

More than 3 years have passed since last update.
動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)

関連

Error

Access violation at address XXXX in module 'プログラム名.exe' 読み取り of address XXXXXXXX.

上記のエラー原因を特定して、コードを見ると以下の状況だと分かった。
(コードは簡素化している)

    String wrk = NULL;

    if (wrk == NULL) {
        ShowMessage(L"NULL1");
    }
    if (wrk.IsEmpty()) {
        ShowMessage(L"NULL2");
    } else {
        ShowMessage(L"something");
    }

上記の結果は以下となる。

  • NULL1が表示される
  • somethingが表示される

実コードにおいて、wrkはUDPからの受信を受ける。
特定条件においてwrkにNULLが入り、.IsEmpty()でない時の処理を実行して、Access violationが発生しているようだ。

code > Indy使用

Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    _di_IIdTextEncoding m_enqSJIS = IndyTextEncoding(932);

    String cmd = L"zabuuun!";

    IdUDPClient1->Host = L"192.168.0.79";
    IdUDPClient1->Send(cmd, m_enqSJIS);
    String res = IdUDPClient1->ReceiveString(1000, m_enqSJIS); // msec

    // ここでresはNULLになる
}
//---------------------------------------------------------------------------

上記の処理で相手先がいない場合、resはNULLが入ることを確認した。
resに対して.IsEmpty()を使うのは良くないだろう。

関連: C++ Builder > 無効なポインタ操作 > 不定値でのFree()によるメモリ破壊 > その後の処理で「無効なポインタ操作」 | Free()でなくdeleteを使う | ヌルポインタ経由でのメンバ関数呼び出しはC++の仕様上は未定義の挙動

コード変更

.IsEmpty()を使う処理の前にNULLチェックを入れることで,
「Access violation at address」エラーは出なくなった。

1
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
7of9
セブンオブナインです。Unimatrix 01の第三付属物 9の7という識別番号です。Star trek Voyagerの好きなキャラクターです。まとめ記事は後日タイトルから内容がわからなくなるため、title検索で見つかるよう個々の記事にしてます。いわゆるBorg集合体の有名なセリフから「お前たち(の知識)を吸収する。抵抗は無意味だ」。Thanks in advance.

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?