小编tex*_*ral的帖子

当 NULL 不是全零位时,全零位指针值是否也是“假”?

我知道 C 编译器不需要对 的位表示使用全零NULL,但标准要求它们* *NULL在布尔上下文/比较中使评估为假。因此,下面程序中的第二个 printf将始终输出false.

但我想知道的是:在系统中NULL*不*全零,将指针值*是*全部为零也值为false布尔上下文/比较?换句话说,将在第一个 printf在下面不断输出的程序true

或者以稍微不同的方式提问:我可以依靠calloc生成一个在布尔上下文/比较中始终评估为 false 的指针值吗?这个问题的第一个答案用于memset清除long*named的位y,然后继续说这y==0是 UB 因为y可能是“陷阱表示”(无论是什么)。 calloc也只是清除位,所以也许o->p一个 printf也是UB?


#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef struct { void * p; } obj;

int main() {
    obj * o = calloc(sizeof(obj), 1);
    assert(o);  // assume successful …
Run Code Online (Sandbox Code Playgroud)

c null pointers undefined-behavior language-lawyer

29
推荐指数
2
解决办法
1505
查看次数

如何将未压缩的文件夹视为压缩文件?

我们都知道用于将压缩文件视为文件夹的第三方工具或操作系统内置工具。但是,有人知道该怎么做吗:诱使OS认为包含某些文件的标准文件夹实际上是压缩文件吗?寻求针对Windows,Linux和Mac的解决方案(尽管我意识到在所有这些平台上都无法使用单个解决方案)。

问题的上下文在于使诸如SVN,Git或Mercurial之类的源代码版本控制系统更有效地存储实际上是压缩文件夹的文档版本之间的差异(保存各种XML文件,一些元数据和一两个缩略图) ),例如ODT和DOCX。

我已经知道Zipdoc和类似的utils,它们使用Git和Mercurial编码/解码钩子将数据转换进出存储库。这是解决该问题的一种很好的方法,但是我发现自己想浏览包含文档未压缩文件夹内容的存储库,并逐个比较其中的文件。

这意味着必须将未压缩的内容添加到存储库中,而不是文档的tar压缩版本或无压缩版本。反过来,这意味着从存储库中签出将产生一个未压缩的文件夹,其中充满了代表文档的文件。因此是我最初的问题。

我设想的神话般的产品将检测到一个名称包含“已注册”扩展名(例如“ docx”)的文件夹,然后将其“重新装入”为同名压缩文件。

或者,有人知道如何利用Git / Mercurial编码/解码钩子来实现这一梦想吗?

git mercurial docx odt

5
推荐指数
1
解决办法
344
查看次数

为什么我不能简单地导入pylint?

我刚刚通过Cygwin软件包安装程序安装了pylint,并且可以从任何.py文件的bash命令行运行它.但是如果我尝试以编程方式在Python会话中导入它,它将失败:

>>> import pylint
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named pylint
Run Code Online (Sandbox Code Playgroud)

但是,如果我执行以下步骤(我在pylint命令行实用程序文件中找到),它的工作原理如下:

>>> __requires__ = 'pylint==1.3.1'
>>> from pkg_resources import load_entry_point
>>> import pylint
>>> pylint.__file__
'/usr/lib/python2.7/site-packages/pylint-1.3.1-py2.7.egg/pylint/__init__.pyc'
Run Code Online (Sandbox Code Playgroud)

我没有必要在我测试的几个linux系统上做额外的步骤.为什么我必须在Cygwin中执行额外的步骤?

出于提供信息的目的,这是我的sys.path:

$ python -c "import sys; print '\n'.join(sys.path)"
/usr/lib/python2.7/site-packages/logilab_common-0.62.0-py2.7.egg
/home/lance/sdp/prereqs/python/lib/python
/usr/lib/python27.zip
/usr/lib/python2.7
/usr/lib/python2.7/plat-cygwin
/usr/lib/python2.7/lib-tk
/usr/lib/python2.7/lib-old
/usr/lib/python2.7/lib-dynload
/usr/lib/python2.7/site-packages
/usr/lib/python2.7/site-packages
Run Code Online (Sandbox Code Playgroud)

python cygwin pylint pkg-resources

5
推荐指数
0
解决办法
628
查看次数

在三元运算符中隐式转换为 void*?

我知道类型化指针void*在传递给需要void*参数的函数时可以隐式转换,但我没想到会在三元操作中看到它(至少我认为这是怎么回事)。

考虑这个简化的代码:

int * dude() {
    float * f = NULL;
    int * i = NULL;
    return (0 ? f : i);  // pointer type mismatch in conditional expression (good: this is what I want)
}
Run Code Online (Sandbox Code Playgroud)

但如果我投ivoid*

int * dude() {
    float * f = NULL;
    int * i = NULL;
    return (0 ? f : (void*)i);  // no error!  it suddenly likes f?  or is f being optimized out?
}
Run Code Online (Sandbox Code Playgroud)

我会更进一步,故意返回 …

c pointers conditional-operator language-lawyer implicit-conversion

5
推荐指数
1
解决办法
119
查看次数

具有 const 和非常量成员的联盟

我正在编写一些向用户公开 const 指针的库代码,但在某些操作期间我需要更改该指针指向的位置(幕后的 switcheroo 技巧)。我必须在不遇到 UB 或严格别名违规的情况下解决这个问题的一个想法是使用带有 const 成员的联合:

// the pointed-to objects (in production code, these are actually malloc'd blocks of mem)
int x = 0, y = 7;

typedef union { int * const cp; int * p; } onion;
onion o = { .cp = &x };
printf("%d\n", *o.cp);   //  <---------------------- prints: 0
o.p = &y;
printf("%d\n", *o.cp);   //  <---------------------- prints: 7
Run Code Online (Sandbox Code Playgroud)

但我不知道这是否是明确定义的......有人知道它是否是(或不是)以及为什么?


编辑:我认为我提到我正在建立一个图书馆,这让事情变得更加混乱,因为很多人要求澄清有关细节,而不是回答我想要的更简单的问题。

int*下面,我通过将类型从 更改为 just 来简化代码int,现在我的问题很简单:以下定义是否明确?

typedef union { int …
Run Code Online (Sandbox Code Playgroud)

c pointers undefined-behavior unions language-lawyer

5
推荐指数
1
解决办法
499
查看次数

比较结构指针、丢弃成员和 UB

考虑以下代码:

int main()
{
    typedef struct { int first; float second; } type;

    type whole = { 1, 2.0 };
    void * vp = &whole;

    struct { int first; } * shorn = vp;
    printf("values: %d, %d\n", ((type *)vp)->first, shorn->first);
    if (vp == shorn)
        printf("ptrs compare the same\n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

两个问题:

  1. 指针相等比较是UB吗?
  2. 关于second初始化行上的成员的“剪切” shorn:像这样抛弃结构成员然后取消引用操纵的指针以访问其余成员是否有效?

c casting strict-aliasing void-pointers undefined-behavior

4
推荐指数
1
解决办法
173
查看次数

这种技术的名称是什么?它是否违反了严格的别名规则或调用了 UB?

我想出了一些使用自引用结构的代码(结构的第一个元素是一个指向函数的指针,该函数将结构的实例作为其唯一的参数)。

将不同的例程传递给另一个进行调用非常有用,因为调用例程不需要知道传递的例程的确切参数构成(请参阅process_string下面代码中的调用点)。传递/调用的例程本身负责以对它们有意义的方式解包(转换)args。

在这篇文章的底部是一些使用这种技术的示例代码。编译时会产生以下输出gcc -std=c99 -Wpedantic -Wall -Wextra -Wconversion

nread: 5
vals[0]: 0.000000
vals[1]: 0.000000
vals[2]: 0.000000
vals[3]: 78.900000
vals[4]: 32.100000
vals[5]: 65.400000
vals[6]: 87.400000
vals[7]: 65.000000
12.3 12.3
34.5 34.5
56.7 56.7
78.9 78.9
32.1 32.1
65.4 65.4
87.4 87.4
65.0 65.0
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 这种技术的名称是什么?正如您从代码中看到的,我一直在使用名称函子,但我不确定这是否正确。它看起来有点像一个闭包,但我认为不是,因为它只是指向它的参数而不是携带它们的副本。
  2. 代码是否违反了严格别名规则?
  3. 代码是否调用未定义行为?

现在是代码:

#include <stdio.h>

typedef struct functor_s functor_t;
typedef int (func_t)(functor_t);
struct functor_s { func_t * _0; void * _1; void * _2; void * _3; void …
Run Code Online (Sandbox Code Playgroud)

c closures currying strict-aliasing undefined-behavior

2
推荐指数
1
解决办法
193
查看次数