投稿数 - 437, コメント - 53951, トラックバック - 156

C++/CLI - memcmp 関数の挙動が Debug ビルドと Release ビルドで異なる

MSDN フォーラムより
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=975888&SiteID=7

確かにそうなる。いろいろ試してみたがどうしても分らない。/clr:pure でなく、/clr オプションでも同じ結果になる。ちなみにノーマル C/C++ だとどちらも結果は「-1」だった。

そう言えば昔、構造体を memcmp して比較するなんて間抜けな事をした覚えがあるが、あれはアライメントを意識していなかったからで、今回は配列だ。

Google Code Search で memcmp の実装を持ってきてそれを使ったところ、正常に動作(Debug とか Release とか関係ない)した。

バグか? C++/CLI 特有の何かがあるのだろうか。C++ な人おせーて。

投稿日時 : 2006年12月5日 21:33

フィードバック

# re: C++/CLI - memcmp 関数の挙動が Debug ビルドと Release ビルドで異なる

C++なひとが来ましたよ。
…えーと、
VC++8のRuntime-source見る限り、
*p0 == *p1 である間 ++p0; ++p1 し、
!= になった時点で
unsigned charとして比較した(引き算の)結果を返すハズです。
だから7Fと80をunsignedで比べたら7F<80だから-1が正解でしょうねぇ。
2006/12/05 23:22 | επιστημη

# re: C++/CLI - memcmp 関数の挙動が Debug ビルドと Release ビルドで異なる

ありがとうございます。
そうなんですよね。でも Release だと 1 が。何故ー!?
2006/12/06 0:13 | 囚人

# re: C++/CLI - memcmp 関数の挙動が Debug ビルドと Release ビルドで異なる

ILを覗いてみました。
debug版ではスナオにmemcmpをcallしてるんだけど、
release版ではinlineに書き下してます。

--- debug
public static unsafe void doit()
{
$ArrayType$$$BY00E e$$$bye1;
$ArrayType$$$BY00E e$$$bye2;
*((sbyte*) &e$$$bye2) = 0x7f;
*((sbyte*) &e$$$bye1) = 0x80;
int num1 = memcmp((void modopt(IsConst)*) &e$$$bye2, (void modopt(IsConst)*) &e$$$bye1, 1);
Console.WriteLine(num1.ToString());
}


--- release
public static unsafe void doit()
{
int num5;
$ArrayType$$$BY00E e$$$bye1;
$ArrayType$$$BY00E e$$$bye2;
*((sbyte*) &e$$$bye2) = 0x7f;
*((sbyte*) &e$$$bye1) = 0x80;
uint num4 = 1;
$ArrayType$$$BY00E* e$$$byePtr2 = &e$$$bye1;
$ArrayType$$$BY00E* e$$$byePtr1 = &e$$$bye2;
int num3 = 0;
sbyte num2 = 0x7f;
sbyte num1 = -128;
do
{
if (num2 > num1)
{
num3 = 1;
goto Label_0049;
}
if (num4 == 1)
{
goto Label_0049;
}
num4 -= 1;
e$$$byePtr1++;
e$$$byePtr2++;
num2 = *((sbyte*) e$$$byePtr1);
num1 = *((sbyte*) e$$$byePtr2);
}
while (num2 >= num1);
num3 = -1;
Label_0049:
num5 = num3;
Console.WriteLine(num5.ToString());
}

…なんか怪しげです。
2006/12/06 0:58 | επιστημη

# re: C++/CLI - memcmp 関数の挙動が Debug ビルドと Release ビルドで異なる

0x7f と -128(0x80) とを "signed byte" で比較してますねぇ...
2006/12/06 1:01 | επιστημη

# re: C++/CLI - memcmp 関数の挙動が Debug ビルドと Release ビルドで異なる

お~!その発想なかったですわ~。さすがえぴすさん。
早速フィードバックを…ってもうやってる!さすがっす。
では、続きは Web で。
2006/12/06 12:13 | 囚人

# IyLDZHgiLSqalYFylwu

Thanks:) Cool topic, write more often! You manage with it perfctly:D
2011/11/28 19:58 | http://www.instawares.com/

# aFNTZXXnYAbmIgtl

Cool:) I would say say it exploded my brain..!

# rXWYiGFSalcgrFbFRLL

Are you interested in webmaster`s income?!...

# RxrWvANqkKjYZ

Of course, I understand a little about this post but will try cope with it!!...
2011/12/27 6:08 | http://www.hansensurf.com

# DnFQGvCJjmNIURy

comment3
2012/01/14 2:53 | http://www.michelegreenmd.com/

コメントの投稿

タイトル
名前
URL
コメント