luv*_*ere 50 c# c++ undefined-behavior
在C++中,有很多方法可以编写编译的代码,但会产生未定义的行为(维基百科).C#中有类似的东西吗?我们可以用编译的C#编写代码,但是有未定义的行为吗?
Eri*_*ert 40
正如其他人所提到的,"不安全"块中的任何内容都可以产生实现定义的行为; 滥用不安全的块允许您更改构成运行时本身的代码字节,因此所有的赌注都是关闭的.
整数除法的极移情况具有实现定义的行为.
抛出异常并且永远不会捕获它会导致实现定义的行为 - 终止进程,启动调试器等等.
在C#中还有许多其他情况,我们被迫发出具有实现确定行为的代码.例如,这种情况:
http://blogs.msdn.com/ericlippert/archive/2006/04/06/odious-ambiguous-overloads-part-two.aspx
但是,安全,性能良好的C#程序具有实现定义行为的情况应该非常少见.
Jos*_*rty 33
是! 即使在安全的背景下,也有!(好吧,它的实现定义为未定义,至少)
这是一个来自Marek Safar和VSadov的Roslyn问题.在C#和CLI之间存在着不匹配的问题bool
.
C#认为只有一种true
,一种false
.
CLI认为这false
是一个包含0的字节,其他所有值都是true
.
这种差异意味着我们可以强迫C#做一些(略微)有趣的事情:
//non-standard bool
//We're setting a bool's value to a byte value of 5.
var a = new bool[1];
Buffer.SetByte(a, 0, 5);
//non-standard bool
//We're setting a bool's value to a byte value of 10.
var b = new bool[1];
Buffer.SetByte(b, 0, 10);
//Both are true.
Console.WriteLine(a[0]);
Console.WriteLine(b[0]);
//But they are not the same true.
Console.WriteLine(a[0] == b[0]);
Run Code Online (Sandbox Code Playgroud)
以上输出:
true
true
false
有趣的是,调试器不同意(必须以不同的方式评估真相?)
无论如何,C#团队似乎已经得出结论(重点补充):
IE语言将完全不关心非标准bool.特定实现(如在CIL上的MS C#中)将确认非标准bool的存在并将其行为指定为undefined
Bre*_*len 12
查看Wiki,不允许发生未定义行为的情况或在C#中抛出异常.
但是在不安全的代码中,我认为未定义的行为是可能的,因为它允许您使用指针等.
编辑:看起来我是对的:http://msdn.microsoft.com/en-us/library/aa664771%28VS.71%29.aspx
在c#中有一个未定义行为的例子
Hen*_*man 11
根据ECMA-334文件(第473页):
不包含任何unsafe修饰符的程序不能表现出任何未定义的行为.
这促使"实施定义"最坏的情况,请参阅Eric Lippert的回答.
归档时间: |
|
查看次数: |
4080 次 |
最近记录: |