请读过标准的同学判断此例是否属未定义行为

yisikaipu 2012-10-30 02:02:35
class A
{
public:
void prinfs()
{
cout<<"aaaaa"<<endl;
}
};

int main( )
{
A *a;
a->prinfs();
return 0;
}


这这么段代码了

请教,按 ISO C/C++ 各个版本标准,此处是否属于未定义行为。我认为是,求确认。如果你的答案是否,或者不确定,请给出具体条款做为依据

下面是发帖缘由/起因,没兴趣的请忽略

1,《这个野指针不?为什么可以使用?》http://topic.csdn.net/u/20121023/14/92b13460-eb72-4825-9ae9-664241f3a604.html

My_Love #37楼
yisikaipu #40楼
My_Love #43楼
yisikaipu #45楼

在这个帖子里争论就到此

2,因为My_Love是有头像的,而且头像里有个猪头(这不是讽刺,是个龙头也一样的),容易区分,所以看到后面的《神了》帖时,我感觉这个头像见过

《神了》帖本身没什么问题,和未定义行为也无关。但我手贱多敲了两句废话,意思是不顾标准的,才会大惊小怪

《神了:空类sizeof=8,你的编译器是怎样的?》http://topic.csdn.net/u/20121025/11/6fd9575e-3ee8-49e0-ac3d-6fc2c145759e.html

yisikaipu #6楼,#7楼
My_Love #8楼
yisikaipu #9楼,#10楼
My_Love #11楼
yisikaipu #12楼

这个帖子就到此

3,可原来My_Love据说是很读过标准的,其表现,不但不会是大惊小怪,而且也不会是恼羞成怒,老前辈就是这风格!

这个帖我是刚看到的,《yisikaipu怎么咬着人不放》http://topic.csdn.net/u/20121025/16/a27f3fe2-e9cb-4356-9d5d-dcff828c1330.html
...全文
2068 75 打赏 收藏 转发到动态 举报
写回复
用AI写文章
75 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanweiwu 2013-03-06
  • 打赏
  • 举报
回复
好久没上csdn,上来看,果然还是唧唧歪歪。 不折不扣的标准帝,还太年轻。 如果你或者你的团队能开发出一套符合标准的编译器,我此生就为你们所谓的标准而奋斗。 一般来说都是闲的蛋疼的才会上来这里,我承认,我今天很蛋疼。。。 算了,你们也没那本事,我也只是上来唧唧歪歪的。换个心情。。。
yisikaipu 2012-11-28
  • 打赏
  • 举报
回复
无意中看到一帖,帖子本身无关,但被选中的答案我看了很想笑,呵呵。顺便收下 http://stackoverflow.com/questions/11538080/why-unsafe-cast-using-static-cast-operator-do-not-crash On most compilers I've seen, calling a non-virtual method that doesn't access class members on a NULL pointer works, but it remains undefined. 另外,记得还有一句很明确的描述,也记个号 2011标准 $5.2.2/1 ... [Note: a member function call of the form f() is interpreted as (*this).f() (see 9.3.1). —end note] ...
yisikaipu 2012-11-24
  • 打赏
  • 举报
回复
引用 72 楼 My_Love 的回复:
标准也说了叫未指定行为,不是未定义行为。所有未定义行为都是标准定义过的。 注意C/C++标准的未定义是行为结果未定义!!! 标准没规定的属于未指定行为。
第一,这个说法不是我的,我只是转述 我在#45楼的转述是这样的:“然后有人回复说:按标准的逻辑,标准没说的,那么不也是UB么” 想不起来是哪个帖子里的场景了。随便举个例子吧 http://stackoverflow.com/questions/2727834/c-standard-dereferencing-null-pointer-to-get-a-reference 这里有同学认为:any behaviour that is not explicitly defined is considered undefined 另外,本帖的#22楼不也有类似表述么: 标准是有漏洞的,只是列出来某些为定义行为,或者编译器自行实现。 没找到标准明确说合法的代码,那么就应该认为是未定义行为。 第二,既然我转述了,就当是我的观点也无妨的 本来对于这类表述,理解大意即可。大意无非是标准没有提到的行为,可以是未定义行为。这样说,无非是区别于通常所听说的诸如“法律没有禁止的就不是非法的”之类的逻辑。现在既然有人计较,那么严谨起见,不妨表述为:标准没有明确定义的行为,可能是未定义行为。依据如下: 03标准$1.3.12 undefined behavior Undefined behavior may also be expected when this International Standard omits the description of any explicit definition of behavior. 或11标准$1.3.24 undefined behavior Note: Undefined behavior may be expected when this International Standard omits any explicit definition of behavior or when a program uses an erroneous construct or erroneous data. 第三,我更正了不严谨的表述。那么你的表述呢 上面已足以反驳你所谓的“所有未定义行为都是标准定义过的” 而你所谓“标准没规定的属于未指定行为”表述严谨?实在不清楚这里“规定”一词对应哪个单词。再说,你提未指定行为作甚? 标准关于未指定行为的说明如下: 03标准$1.3.13 unspecified behavior behavior, for a well-formed program construct and correct data, that depends on the implementation. The implementation is not required to document which behavior occurs. [Note: usually, the range of possible behaviors is delineated by this International Standard. ] 11标准$1.3.25 unspecified behavior behavior, for a well-formed program construct and correct data, that depends on the implementation [Note: The implementation is not required to document which behavior occurs. The range of possible behaviors is usually delineated by this International Standard. —end note ] 显然,这里的未指定,是指具体哪种行为是未指定的。具体是哪些可能的行为,则通常都有描述,即都有提到。C99标准里说得更明确: C99 $3.4.4/1 unspeci?ed behavior behavior where this International Standard provides two or more possibilities and imposes no further requirements on which is chosen in any instance 本帖相关上下文,明显是指标准没有提到的行为,这与未指定行为(提到可能的行为但未具体指定)完全不会产生混淆。即便未定义的行为未必就是未定义行为,那跟未指定行为也没什么关系,扯出它来作甚呢?!表明自己很读过标准?
引用 73 楼 My_Love 的回复:
这一条的前提条件呢,你看了吗?融会贯通...
所谓前提条件又是你的POD例外论吗?屑于给出具体条款吗?或者是实在给不出具体条款只能靠“融会”了? 但貌似你的观点是:“这段代码有明确的行为”“显然楼主的代码没有virtual,所以说是明确定义的行为!” 那么“明确定义”在哪里呢? 在一再强调应讨论具体条款的帖子里,很屑于表明自己读过标准,却又不屑于用任何具体条款讨论的,这是何必呢?!
My_Love 2012-11-23
  • 打赏
  • 举报
回复
引用 71 楼 yisikaipu 的回复:
有这么一条再明确不过的表述似乎没同学提到 ISO/IEC 14882:2003(E) $5.2.2/4 When a function is called, each parameter (8.3.5) shall be initialized (8.5, 12.8, 12.1) with its corresponding argument. If the ……
这一条的前提条件呢,你看了吗?融会贯通...
My_Love 2012-11-23
  • 打赏
  • 举报
回复
引用 45 楼 yisikaipu 的回复:
引用 42 楼 fenix124 的回复:这个不是BUG。有专门这样使用的。 P* XXX; //这个是C语言的结构,一些函数使用它,比如 void P_OP(P*,int); 呵呵,这样,我给你个帖子 http://stackoverflow.com/questions/2569602/is-there-a-practical-benefit-to-ca……
标准也说了叫未指定行为,不是未定义行为。所有未定义行为都是标准定义过的。 注意C/C++标准的未定义是行为结果未定义!!! 标准没规定的属于未指定行为。
yisikaipu 2012-11-16
  • 打赏
  • 举报
回复
有这么一条再明确不过的表述似乎没同学提到 ISO/IEC 14882:2003(E) $5.2.2/4 When a function is called, each parameter (8.3.5) shall be initialized (8.5, 12.8, 12.1) with its corresponding argument. If the function is a nonstatic member function, the “this” parameter of the function (9.3.2) shall be initialized with a pointer to the object of the call, converted as if by an explicit type conversion (5.4). ...
yisikaipu 2012-11-11
  • 打赏
  • 举报
回复
引用 68 楼 pengzhixi 的回复:
额 我不觉得这个是一个未定义的行为 我认为是错误代码。 一个很明显的问题就是如果你的这个函数访问了某一个数据成员的话。绝对崩溃。 虽然你这里没有访问所以看上去在任何编译器上都没问题。所以你得这个情况只能归结到特殊情况而已。 ptr->mem_fun()会最终转化为(*ptr).mem_fun()的形式。所以我不觉得这样的代码可以归纳到undefine behavior
既然同意“最终转化为(*ptr).mem_fun()的形式”,那么解引用不确定的指针,不就是未定义行为吗
pengzhixi 2012-11-08
  • 打赏
  • 举报
回复
我暂时也没找标准针对这个情况的说明。
pengzhixi 2012-11-08
  • 打赏
  • 举报
回复
额 我不觉得这个是一个未定义的行为 我认为是错误代码。 一个很明显的问题就是如果你的这个函数访问了某一个数据成员的话。绝对崩溃。 虽然你这里没有访问所以看上去在任何编译器上都没问题。所以你得这个情况只能归结到特殊情况而已。 ptr->mem_fun()会最终转化为(*ptr).mem_fun()的形式。所以我不觉得这样的代码可以归纳到undefine behavior
qq13174115 2012-11-08
  • 打赏
  • 举报
回复
[转]深入解析c++静态联编和类的成员函数调用 看我的博客 http://www.cppblog.com/aaxron/archive/2010/10/26/131317.html
qq13174115 2012-11-08
  • 打赏
  • 举报
回复
看我的博客 http://www.cppblog.com/aaxron/archive/2010/10/26/131317.html
haitao 2012-11-06
  • 打赏
  • 举报
回复
关键是:类函数,不需要->左边的对象(指针)有效 如果语言严格一点,可以强制 类函数的调用方式,->左边不能是对象(指针),而必须是类型
大熊猫侯佩 2012-11-06
  • 打赏
  • 举报
回复
标准帝又来鸟
飞天御剑流 2012-11-06
  • 打赏
  • 举报
回复
看见上面一些人的帖子内容,让人觉得,C++最失败的地方,不仅仅在于早期对“C++是一门面向对象的语言”的过分强调,还在于没有让学习者认识标准、学习标准和使用标准。
那一年我们21 2012-11-06
  • 打赏
  • 举报
回复
说实话有点 装 实话 没别的意思
TheNewIpad 2012-11-06
  • 打赏
  • 举报
回复
楼主应该说,这样的代码违反了那个版本的C++规范了。 我看这属于挺好的代码。只不过实际系统不干而已。 呵呵, 使劲跟楼主讨论的,都属于闲的蛋蛋疼的、属于应该被开除的一员。
  • 打赏
  • 举报
回复
ri_aje 2012-11-06
  • 打赏
  • 举报
回复
国外的大牛也在讨论类似的话题,newsgroup 经常能看到相关问题的讨论。标准不是说变就变的,实际上早期的 c++ 倒是支持用空指针直接调用静态成员函数呢,标准化的过程中决议认定此类行为为未定义行为,从这个角度说现在标准所持的观点已经是经过斟酌的了,开倒车变回去的可能性微乎其微了。国外的大牛确实在考虑更好的制定新标准,但没有任何事物是脱离历史存在的,新标准正是在这些看似无意义的讨论中逐渐完善的。std.c++ 上还能看到更离奇古怪的问题,提议和用法交流呢。 很多时候很难说什么有意义,什么无意义。著名物理学家法拉第在刚发现电磁感应时,还被人问及这种东西有什么用呢,法拉第睿智的反问说新生儿能干什么呢?百年后回望历史,当初的提问人已显过于无知。c++ 非自然科学,诚然不可与物理比肩,我辈之于法拉第更是平庸无能,但这种海纳百川的胸襟在我看正是西方自然科学能够走到今天的重要人文基石。如果只在乎眼前能够看到的利益,难免会认为没有可见近期收益的事情都属于不重要的。
qhlonline 2012-11-06
  • 打赏
  • 举报
回复
感觉这种代码应该被禁止使用就是了。至于标准的争论,倒不是那么必须。就好比现有的Internet协议模型,完全不按照ISO7层模型来;但是它就是业界的事实标准;反而那个一板一眼的7层模型,被束之高阁。 感觉为了这些事情争论,就好比孔乙己对茴香豆的回字有几种写法痴迷一样;国外的大牛们都在考虑更好的制定标准,完善标准,调整标准;而我们这里的大牛们却在讨论一个简单写法是否符合标准,不可笑么?万一你讨论完了,统一意见了,人家标准变了呢?有啥意义么? 标准是人定义的,是用来解决问题的,不是用来生产问题的。如果你了解了他的标准的主旨,那就够了。没必要用它来做争论什么的。更多的精力可以花到更有意义的事情上。
zicheng_lin 2012-11-06
  • 打赏
  • 举报
回复
引用 7 楼 howard58888 的回复:
不是未定义,是正确的 printf在编译时会被编译成printf(A *this){ cout<<"wet"<<endl;} A *a;//指向一个未知空间 a->prinfs();//实际上就转换成 printf(*a)//函数体中没有引用任何*a对象的成员,故不会报错 A{ public: int t; void printf(……
+1 这个东西在 <<深度解析C++对象模型>>里有讲到
加载更多回复(55)

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧