精华内容
下载资源
问答
  • int左移32位的行为未定义 Coverity 代码静态安全检测 Is Shifting more than 32 bits of a uint64_t integer on an x86 machine Undefined Behavior? uint64_t s = 1 << 32; uint64_t s = 1ULL <...

    int左移32位的行为未定义

    Coverity 代码静态安全检测

    Is Shifting more than 32 bits of a uint64_t integer on an x86 machine Undefined Behavior?

     

    uint64_t s = 1 << 32;
    
    uint64_t s = 1ULL << 32;
    
    Note, however, that if you write a literal that fits into 32 bits, e.g. uint64_t s = 1 << 32 as surmised by @drhirsch, 
    you don't actually shift a 64-bit value but a 32-bit one. That is undefined behaviour. The most common results are a
    shift by shift_distance % 32 or 0, depending on what the hardware does.

     

    转载于:https://www.cnblogs.com/jingzhishen/p/5939109.html

    展开全文
  • 如果两段内存重叠,用memcpy函数可能会导致行为未定义,改进: void* memmove(void* str1,const void* str2,size_t n) { char* pStr1= (char*) str1; const char* pStr2=(const char*)str2; if (pStr1 ) { ...

    如果两段内存重叠,用memcpy函数可能会导致行为未定义,改进:

    void* memmove(void* str1,const void* str2,size_t n)
    {
    	char* pStr1= (char*) str1;
    	const char* pStr2=(const char*)str2;
    	if  (pStr1 < pStr2 ) 
    	{
    		for(size_t i=0;i!=n;++i)
    		{
    			*(pStr1++)=*(pStr2++);
    		}
    	}
    	else
    	{
    		pStr1+=n-1;
    		pStr2+=n-1;
    		for(size_t i=0;i!=n;++i)
    		{
    			*(pStr1--)=*(pStr2--);
    		}
    	}
    	return (str1);
    }
    int main()
    {
    	// 内存重叠
    	char c1[] = "hello world";
    	memmove(c1+3, c1, 8);
    	cout<<"memmove result:   "<<c1<<endl; //输出结果:helhello wo
    
    	memcpy(c1+3,c1,8);
    	//cout<<"memcpy:   "<<c1<<endl;  // <span style="line-height: 28.7999992370605px; font-family: arial, STHeiti, 'Microsoft YaHei', 宋体;">输出</span><span style="line-height: 28.7999992370605px; font-family: arial, STHeiti, 'Microsoft YaHei', 宋体;">结果:</span><span style="line-height: 28.7999992370605px; font-family: arial, STHeiti, 'Microsoft YaHei', 宋体;">helhelhell0</span>
    
    	// 内存不重叠
    	char c2[] = "hello world";
    	char c3[] = "love you";
    	memmove(c2,c3,8);
    	//cout<<"memmove result:"<<c2<<endl;//<span style="line-height: 28.7999992370605px; font-family: arial, STHeiti, 'Microsoft YaHei', 宋体;">输出结果:</span><span style="line-height: 28.7999992370605px; font-family: arial, STHeiti, 'Microsoft YaHei', 宋体;">love yourld</span>
    
    	memcpy(c2,c3,8);
    	cout<<"memcpy:   "<<c2<<endl; //输出结果:love yourld
    
    	memcpy(c1+3,c1,8);
    
    }


    展开全文
  • warning C4293: “>>”: Shift 计数为负或过大,其行为未定义  并且运算结果为0。 所以当位运算的移动位数是变量的时候,要对移动位数做是否 >=0 的判断。不然结果可能和预想的不一样(多么痛的领悟)。
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int a =32,b = 32;
    	cout << "(a >>-1 ) = "<<( a >> -1 ) << endl;
    	cout << "(b >>-1 ) = "<<( b >> -1 ) << endl;
    	return 0;
    }

     

    c++ 位运算 左移右移 需要注意,当移动位数为负数时,会有警告

    warning C4293: “>>”: Shift 计数为负或过大,其行为未定义

     并且运算结果为0。

    所以当位运算的移动位数是变量的时候,要对移动位数做是否  >=0  的判断。不然结果可能和预想的不一样(多么痛的领悟)。

    展开全文
  • 未定义行为

    2017-12-25 22:07:48
    未定义行为是指C语言标准未做规定的行为。同时,标准也从没要求编译器判断未定义行为,所以这些行为有编译器自行处理,在不同的编译器可能会产生不同的结果;或者程序调用未定义行为,可能会成功编译,甚至一开始...


    未定义行为是指C语言标准未做规定的行为。同时,标准也从没要求编译器判断未定义行为,所以这些行为有编译器自行处理,在不同的编译器可能会产生不同的结果;或者程序调用未定义行为,可能会成功编译,甚至一开始运行时没有错误,只会在另一个系统上,甚至在另一个日期运行失败。

    当一个未定义行为的实例发生时,“什么事情都可能发生”,也许什么都没有发生。


    未定义行为就是运行结果不确定。


    eg:

    1、一个变量即是左边的结果,又是右边的操作数,如a+=a++,a%=b^=a^=b^=a

    2、使用越界数组也是C的一个“未定义行为”

    3、允许一个随便指的指针的读写

    4、使用未初始化的变量


    下面C代码中,不属于未定义行为的是:C

    A、int i=0; i=(i++);

    B、char *p="hello";p[1]='E';

    C、char *p="hello";char ch=*p++;

    D、int i=0;printf("%d%d\n",i++,i--);

    E、都是未定义行为

    F、都不是未定义行为

    解析: 

    A在GCC下输出0,在VC6.0中输出1;

    B在GCC下输出段错误(核心已转储),在VC6.0下输出会停止工作,出现问题,导致程序停止正常工作。(常量字符串不允许修改,因为放在常量区,一修改就错)

    C正常;(C修改的是指针的值,没有修改指针指向常量的值。)

    D在GCC下输出-1、0;在BC6.0下输出0、0;



    补充:不要依赖未定义行为。

    C++中的未定义行为有:

    1、连接字符串字面值和宽字符串字面值。

    2、使用在函数体内定义的未初始化的变量。

    3、获取不存在的元素也是未定义行为。例如:数组、string、vector等通过下标操作符获取超过该对象的长度元素。

    所谓的“缓冲区溢出”问题就是对不存在的元素进行下标操作的结果。这样的缺陷往往导致PC机和其他应用中最常见的安全问题。

    4、若造成非有2个以上的操作数,则求这两个操作数的值的顺序未定义。

    展开全文
  • C++未定义行为

    2015-06-30 15:53:00
    今天算是长见识了。引用自《C语言undefined ...同时,标准也从没要求编译器判断未定义行为,所以这些行为有编译器自行处理,在不同的编译器可能会产生不同的结果,又或者如果程序调用未定义行为,可能会成功...
  • C语言未定义行为

    2018-04-08 16:58:16
    写在前面的话: ...感谢博主,是真的结合自己的感受写出来的,而且练习题哈哈哈和我遇上的也...简单地说,未定义行为是指C语言标准未做规定的行为。编译器可能不会报错,但是这些行为编译器会自行处理,所以不同的编译...
  • 什么叫做未定义行为

    2019-08-24 09:51:37
    一、未定义行为 C语言中的未定义行为(Undefined Behavior)是指C语言标准未做规定的行为。 同时,标准也从没要求编译器判断未定义行为,所以这些行为有编译器自行处理,在不同的编译器可能会产生不同的结果,...
  • C语言的未定义行为

    2017-07-07 12:33:59
    下列 C 代码中,不属于未定义行为的有___ 正确答案: C int i=0;i=(i++); char *p=”hello”;p[1]=’E’; char *p=”hello”;char ch=*p++; int i=0;printf(“%d%d\n”,i++,i--); 都...
  • C++中的未定义行为

    2021-01-20 03:35:01
    现在我们需要一个程序从控制台读入一个 INT 型整数(输入确保是INT),然后输出...好了,欢迎走进未定义行为 (Undefined Behavior) 的世界。  什么是未定义行为  文章一开始的程序中用到了 abs 求值函数,当n为
  • C/C++中的未定义行为

    2019-06-28 21:20:18
    文章目录未定义行为(Undefined Behavior)C和C++的未定义行为的一些例子尝试修改字符串字面量会产生未定义行为除以零会导致未定义行为某些指针操作可能导致未定义行为到达返回数值的函数(除main函数以外)的结尾,...
  • 在C/C++编程过程中,有些规则我们不知道这是语言规定的,还是语言未定义的, 比如一些编译器的通用规则、不同平台的差异等,因为语法太多,互相组合嵌套有太多的可能性,而且语言一直在变。 在BF语言编程过程中,...
  • C语言中的未定义行为(Undefined Behavior)是指C语言标准未做规定的行为。同时,标准也从没要求编译器判断未定义行为,所以这些行为有编译器自行处理,在不同的编译器可能会产生不同的结果,又或者如果程序调用...
  • C语言中的未定义行为

    千次阅读 2015-08-10 22:41:59
    C语言中的未定义行为(Undefined Behavior)是指C语言标准未做规定的行为。同时,标准也从没要求编译器判断未定义行为,所以这些行为有编译器自行处理,在不同的编译器可能会产生不同的结果,又或者如果程序调用...
  • 什么是 未定义行为

    千次阅读 2015-11-19 19:41:39
    在C++编程中避免未定义行为是至关重要的。本文的两位作者向我们展示了一些无需牢记整个C++标准就可以使用的方法。  引介  我们常常会在新闻组里看到这样的C++提问:“下面的语句具有良好定义的行为吗?”或者...
  • C/C++未定义行为

    2017-03-29 09:50:15
    下列 C 代码中,不属于未定义行为的有:______。 int i=0;i=(i++); char *p=”hello”;p[1]=’E’ char *p=”hello”;char ch=*p++ int i=0;printf(“%d%d\n”,i++ i--) 都是未定义行为 都不是...
  • 在计算机程序设计中,未定义行为(undefined behavior)是指行为不可预测的计算机代码。这是一些编程语言的一个特点,最有名的是在C语言中。在这些语言中,为了简化标准,并给予实现一定的灵活性,标准特别地规定...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 963
精华内容 385
关键字:

行为未定义