单元测试涉及失败的代码路径的最佳方法是什么malloc()
?在大多数情况下,它可能并不重要,因为你正在做类似的事情
thingy *my_thingy = malloc(sizeof(thingy));
if (my_thingy == NULL) {
fprintf(stderr, "We're so screwed!\n");
exit(EXIT_FAILURE);
}
Run Code Online (Sandbox Code Playgroud)
但在某些情况下,除了死亡之外你还有其他选择,因为你已经为缓存或其他任何东西分配了一些额外的东西,你可以收回那些记忆.
但是,在那些您可以尝试从失败malloc()
中恢复的情况下,您在代码路径中执行的操作非常棘手并且容易出错,这使得测试变得尤为重要.你是怎么做到这一点的?
我需要将一个动态分配的数组(例如从a = new double [100])包装到std :: vector(最好)而不复制数组.这个限制强加于我想要包装的数组是从文件中进行mmaped,所以只做vector(a,a + size)会使内存使用量加倍.
这样做有什么窍门吗?
这是(可能对某人有用)" Bean成员应该序列化 "PMD规则,其中规定了以下内容:
如果一个类是bean,或者由bean直接或间接引用它,则需要可序列化.成员变量需要在类中标记为transient,static或者具有访问器方法.将变量标记为瞬态是最安全和最简单的修改.访问器方法应遵循Java命名约定,即对于名为foo的变量,应提供getFoo()和setFoo()访问器方法.
问题是它目前既没有检查'类是bean,也没有被bean引用'甚至检查类实现'Serializable'接口.因此,在没有访问器的情况下使用几个私有字段的简单类(即使类是最终的),您将获得Sonar标记的主要缺陷.对于大多数课程,它看起来很有趣,所以目前我肯定会停用此规则.
但我确实喜欢检查真正的bean类.是否有可能(以及如何)使用Sonar和开源分析仪的"标准集"(CheckStyle,PMD,findbugs)进行类似(但更智能)的检查?有没有其他方法可以这样做?
我们都会不时编写这样的代码:
try {
// ... some code.
} catch (SomeException e) {
// ... No action is required, just ignore.
}
Run Code Online (Sandbox Code Playgroud)
有没有像注释这样的标准代码片段来表明我们真的打算忽略异常?向其他团队成员和静态分析器展示的东西我们真的需要像InterruptedException
以后一样跳过这种情况Thread.sleep()
吗?就像是:
Exception.ignore(e);
Run Code Online (Sandbox Code Playgroud)
谷歌搜索但没有找到这种情况的标准.
这与确保例外的测试特别相关:
try {
action();
fail("We expected this to fail.");
} catch (ExpectedException e) {
ignore(e, "OK, so far so good.");
}
Run Code Online (Sandbox Code Playgroud) 我知道应该总是用两者编译-Wall
并且-Wextra
因为它们启用警告并帮助我们理解我们的错误,如果有的话.
我已经读过-Wextra
不建议使用编译器标志,因为它太冗长了很多误报.
读这篇文章我很惊讶.所以我开始谷歌搜索它,但我没有得到任何答案,因为所有搜索结果显示" -Wextra
旗帜做什么?".
所以,我的问题是
-Wextra
旗帜会发出不必要的警告?-Wextra
标志启用导致GCC发出这些类型警告的其他标志?考虑以下C程序:
void bar();
void baz();
void foo( int a ) {
if ( a ) {
bar();
}
else {
baz();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的基于x86-64的计算机上,GCC使用-O1优化级别生成的指令给出:
0: sub $0x8,%rsp
4: test %edi,%edi
6: je 14 <foo+0x14>
8: mov $0x0,%eax
d: callq 12 <foo+0x12> # relocation to bar
12: jmp 1e <foo+0x1e>
14: mov $0x0,%eax
19: callq 1e <foo+0x1e> # relocation to baz
1e: add $0x8,%rsp
22: retq
Run Code Online (Sandbox Code Playgroud)
而添加-freorder-blocks优化参数(包含在-O2中)会将代码转换为:
0: sub $0x8,%rsp
4: test %edi,%edi
6: jne 17 <foo+0x17>
8: mov $0x0,%eax
d: …
Run Code Online (Sandbox Code Playgroud) 假设一个 yarn 应用程序有长时间运行的任务(运行 1 小时或更长时间)。当一个 MR 作业启动时,所有集群资源都会被阻塞,至少在一个容器完成之前,这有时可能需要很长时间。
有没有办法限制同时运行的容器数量?类似的东西,例如 map.vcores.max(每个 NM,或全局)。所以其他应用程序不会被阻止。
有任何想法吗?
附:Hadoop 2.3.0
我试图在C中编写一个自定义分配器用于调试目的(作为练习),我将使用单个链表来使用First Fit算法将自由列表保存在一起.我在下面展示了我想在"空内存节点"中创建的结构.
如何在内存的前几个字节处编写头块(一个特定的联合),我得到(我使用malloc()来初始获得一块内存)以便剩余的字节是空闲的?
这是我正在使用的联盟:
/*Define Header Structure for proper alignment*/
union header {
struct{
union header* next;
unsigned size ; /*Make it size_t*/
}s;
double dummy_align_var;
};
-------------------------------------------------------------------------------
|Next |Size of |16Byte| User is concerned only about |16Byte| |
|Free Memory |Allocated|Header| this portion of memory |Footer|Checksum |
|Address |Block |Picket| and has no knowledge of rest |Picket| |
-------------------------------------------------------------------------------
|-------Header---------| ^Address Returned to user
^------User Requested Size-----^
^-------------Memory Obtained From The Operating System-----------------------^
*/
Run Code Online (Sandbox Code Playgroud)
[编辑]根据提供的建议更改块结构.
我将一个中等大小的应用程序从C转移到C++.它不会处理异常,也不会改变.
我(错误!)对C++的理解是(直到我昨天很难学会),(默认)new运算符在分配问题时返回NULL指针.然而,直到1993年(左右)才真实.如今,它会抛出一个std :: bad_alloc异常.
是否有可能在不重写所有内容的情况下返回旧行为,在每次调用时使用std :: nothrow?
我想知道睡眠/纳米睡眠是如何实现的?考虑以下代码:
{ // on a thread other than main() thread
while(1)
{
//do something
sleep(1);
}
}
Run Code Online (Sandbox Code Playgroud)
CPU是否会进行恒定的上下文切换以检查是否完成了1秒的睡眠(即内部忙等待).
我怀疑这种方式是否有效,效率太低.但那又如何运作?
同样的问题适用于nanosleep.
注意:如果这是特定于实现/操作系统的,那么我怎样才能实现一个不会导致上下文切换的更有效的方案呢?
c ×6
c++ ×3
java ×3
gcc ×2
allocation ×1
arrays ×1
assembly ×1
boost ×1
containers ×1
exception ×1
hadoop ×1
hadoop-yarn ×1
javabeans ×1
libc ×1
malloc ×1
memory ×1
optimization ×1
pmd ×1
posix ×1
scheduling ×1
sleep ×1
unit-testing ×1
vector ×1
x86-64 ×1