我的问题分为三个部分
问题一
考虑下面的代码,
#include <iostream>
using namespace std;
int main( int argc, char *argv[])
{
const int v = 50;
int i = 0X7FFFFFFF;
cout<<(i + v)<<endl;
if ( i + v < i )
{
cout<<"Number is negative"<<endl;
}
else
{
cout<<"Number is positive"<<endl;
}
return 0;
}
No specific compiler optimisation options are used or the O's flag is used. It is basic compilation command g++ -o test main.cpp is used to form the executable.
看似非常简单的代码,在 SUSE 64 位操作系统 gcc 4.1.2 中有奇怪的行为。预期输出为“Number is negative”,而仅在 SUSE 64 位操作系统中,输出为“Number is positive”。
经过一些分析并对代码进行“disass”后,我发现编译器按以下格式进行了优化 -
if ( v < 0 ) ,其中 v 是正常数,因此在编译过程中,else 部分 cout 函数地址被添加到寄存器中。找不到 cmp/jmp 指令。我看到该行为仅在 gcc 4.1.2 SUSE 10 中出现。在 AIX 5.1/5.3 和 HP IA64 中尝试时,结果符合预期。
上面的优化是否有效?
或者,对 int 使用溢出机制不是有效的用例吗?
问题二
现在,当我从 if (i + v < i) 更改条件语句时至 if ( (i + v) < i )即使那样,行为也是一样的,至少我个人不同意这一点,因为提供了额外的大括号,我希望编译器创建一个临时的内置类型变量并进行比较,从而使优化无效。
问题三
假设我有一个庞大的代码库,我迁移了我的编译器版本,这样的错误/优化可能会对我的系统行为造成严重破坏。当然从业务角度来说,仅仅因为编译器升级就把所有代码行都重新测试一遍是非常没有效果的。
我认为出于所有实际目的,这些类型的错误很难(在升级期间)捕获,并且总是会泄露到生产站点。
谁能建议任何可能的方法来确保这些错误/优化不会对我现有的系统/代码库产生任何影响?
附言:
更新(1)
我想达到什么目的?变量 i 将是一个计数器(一种 syncID)。如果我进行离线操作(50 次操作),那么在启动期间,我想重置我的计数器,为此我正在检查边界值(以重置它)而不是盲目地添加它。
我不确定我是否依赖于硬件实现。我知道 0X7FFFFFFF 是最大正值。我所做的就是,通过为此增加值(value),我期望返回值为负。我不认为这个逻辑与硬件实现有任何关系。
无论如何,非常感谢您的投入。
更新(2)
大多数 inpit 声明我依赖于溢出检查的较低级别行为。我有一个关于相同的问题,
除非我检查数字的负性,否则我无法做到这一点。所以我的主张是,当一个值被添加到 +MAX_INT 时,int 必须返回一个负数。
请让我知道您的意见。
最佳答案
这是一个已知问题,我不认为它是编译器中的错误。当我用 gcc 4.5 和 -Wall -O2 编译时它警告
warning: assuming signed overflow does not occur when assuming that (X + c) < X is always false
尽管您的代码确实溢出了。
您可以传递 -fno-strict-overflow 标志来关闭该特定优化。
关于c++ - gcc优化?漏洞?及其对项目的实际意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2892477/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="
假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit
点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度; 在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
目录1.漏洞简介2、AJP13协议介绍Tomcat主要有两大功能:3.Tomcat远程文件包含漏洞分析4.漏洞复现 5、漏洞分析6.RCE实现的原理1.漏洞简介2020年2月20日,公开CNVD的漏洞公告中发现ApacheTomcat文件包含漏洞(CVE-2020-1938)。ApacheTomcat是Apache开源组织开发的用于处理HTTP服务的项目。ApacheTomcat服务器中被发现存在文件包含漏洞,攻击者可利用该漏洞读取或包含Tomcat上所有webapp目录下的任意文件。该漏洞是一个单独的文件包含漏洞,依赖于Tomcat的AJP(定向包协议)。AJP自身存在一定缺陷,导致存在可控