如果我正确地解释C++引用,它们就像指针一样,但保证数据完整性(没有NULL,没有(int*)0x12345).但是当引用对象的范围被遗漏时会发生什么?如果没有涉及魔法(可能不是),引用的对象将在我背后被摧毁.
我写了一段代码来检查:
#include <iostream>
using namespace std;
class A {
public:
A(int k) { _k = k; };
int get() { return _k; };
int _k;
};
class B {
public:
B(A& a) : _a(a) {}
void b() { cout << _a.get(); }
A& _a;
};
B* f() {
A a(10);
return new B(a);
}
int main() {
f()->b();
}
Run Code Online (Sandbox Code Playgroud)
该_k实例变量放入检查堆栈帧的存在.
令人惊讶的是,它不是段错误而是正确地打印'10',而我认为它A是在堆栈上分配的,并且堆栈帧f()将被至少cout<<调用覆盖.
假设我有两个文件a.h:
#if 1
#include "b.h"
Run Code Online (Sandbox Code Playgroud)
并且b.h:
#endif
Run Code Online (Sandbox Code Playgroud)
gcc和clang的预处理器都拒绝a.h:
$ cpp -ansi -pedantic a.h >/dev/null
In file included from a.h:2:0:
b.h:1:2: error: #endif without #if
#endif
^
a.h:1:0: error: unterminated #if
#if 1
^
Run Code Online (Sandbox Code Playgroud)
但是,C标准(N1570 6.10.2.3)说:
表单的预处理指令
# include "q-char-sequence" new-line导致由
"分隔符之间的指定序列标识的源文件的全部内容替换该指令.
这似乎允许上面的结构.
gcc和clang在拒绝我的代码方面不合规吗?
我目前正在使用Graphviz来可视化控制流图.基本上,(可简化的)控制流图是DAG加上一些指向前一层中节点的边.后一条边不应影响节点放置.
目前,dot绘制图形非常整齐,但它缺乏一种简单的方法来添加交互性(例如折叠,滚动,缩放),这对于分析非常大的图形是无价的.因此,我选择d3.js作为最成熟且功能最丰富的图形库.
我很确定在d3.js 中有一种简单的方法来绘制分层图形(如同dot),但我似乎并不认识它.我怎么做?如果这有帮助,我已经对我的CFG进行了支配者分析.
是否有ARM处理器的Scheme编译器(不是解释器),特别是Cortex-M3?我正在寻找一个编译器,而不是一个解释器,以便在(相对)慢的处理器上获得可预测的小执行时间.它可能会省略规范的某些部分(可能是延续); 没关系.
我应该注意到我只有8 kB(可能是2-4倍)的RAM.
我将尝试使用答案中的所有内容,然后回复我的发现.这可能需要一些时间.
我最近为AVM2/AS3制作了一个反编译器,我注意到Flash编译器往往会发出大量不必要的代码.例如,对于某个应用程序,我删除了大约10%的代码而没有任何功能损害.它只是一个肯定死的代码,没有被条件操作码和异常处理块引用.
另外,请看这个片段:
...
313 setproperty y
315 getlocal 12
317 returnvalue
318 jump L9
L3:
322 getlocal 8
324 returnvalue
L9:
325 jump L10 ; L10 (opcode #331) does not ever exist.
; Technically, it is a jump beyond
; the end of function. This is invalid code!
L2:
329 pushnull
330 returnvalue
Run Code Online (Sandbox Code Playgroud)
好吧,当然这是无效的代码,它也是死的,因此不会造成任何不利影响(代码库膨胀除外).但为什么它会发出那些代码呢?为什么验证者会接受?
我写了一个必须在Linux上使用串口的应用程序,尤其是ttyUSB.使用标准的select()/ read()循环和write()执行读写操作,并且它们可能没有任何问题,但初始化代码(或缺少某些部分)会损坏tty子系统中的某些内容.这里是:
vuxboot(string filename, unsigned baud = B115200) : _debug(false) {
_fd = open(filename.c_str(), O_RDWR | O_NOCTTY);
if(_fd < 0) throw new io_error("cannot open port");
// Serial initialization was written with FTDI USB-to-serial converters
// in mind. Anyway, who wants to use non-8n1 protocol?
tcgetattr(_fd, &_termios);
termios tio = {0};
tio.c_iflag = IGNPAR;
tio.c_oflag = 0;
tio.c_cflag = baud | CLOCAL | CREAD | CS8;
tio.c_lflag = 0;
tcflush(_fd, TCIFLUSH);
tcsetattr(_fd, TCSANOW, &tio);
}
Run Code Online (Sandbox Code Playgroud)
另一个tcsetattr(_fd, TCSANOW, &_termios)坐在析构函数中,但它无关紧要.
无论有没有这个termios初始化, …
我有一个大型OCaml项目,我正在使用ocamlbuild进行编译.一切正常,我有一个伟大的可执行文件,可以按我的要求完成所有操作.问题是,当我把原生可执行文件"my_prog.native"运行到其他地方(不同的机器使用相同的操作系统等)时,新机器抱怨它找不到洋甘菊(用于电池)库我正在使用).我认为我们从ocamlbuild得到了可执行文件是独立的,不需要的OCaml或甘菊存在于我们跑了机器,但似乎并不如此.
关于如何制作真正的独立可执行文件的任何想法?
我想通过无线电通道以 48K 速率(对应于每通道 768 Kbit 的 16 位样本)传输立体声音频流,并使用 Cortex-M3 微控制器将其馈送到 DAC。虽然该通道在技术上以 2 Mbit 工作,但范围会随着速度迅速下降,我想在一定程度上对其进行优化。
是否有任何无损音频编解码器可以在具有约 8K 内存的微控制器上工作,大约。20 MIPS 的处理能力、32 位硬件乘法器和没有硬件除数?我不需要很大的压缩比,但它应该正确处理流错误并且在播放中没有长时间的停顿。