综合编程

Nil in gdb is not set to 0x0?

微信扫一扫,分享到朋友圈

Nil in gdb is not set to 0x0?
0

I was stepping through some simple Objective-C code with gdb (inside of Xcode) and noticed something strange. Here is the relevant snippet:

NSString *s = nil;
int x = (s == nil);

As I’d expect, the value of x
after these two lines is 1
. Strangely, if I try something similar in gdb, it doesn’t work the same:

(gdb) print ret
$1 = (NSString *) 0x0
(gdb) print (int)(ret==nil)
$2 = 0
(gdb) print nil
$3 = {<text variable, no debug info>} 0x167d18 <nil>

It seems like gdb has some definition for nil other than what objective-C uses (0x0). Can someone explain what’s going on here?

When your code is being compiled, nil
is a preprocessor constant defined to be either __null
(a special GCC variable that serves as NULL
), 0L
, or 0
:

<objc/objc.h>
#ifndef nil
#define nil __DARWIN_NULL /* id of Nil instance */
#endif

<sys/_types.h>
#ifdef __cplusplus
#ifdef __GNUG__
#define __DARWIN_NULL __null
#else /* ! __GNUG__ */
#ifdef __LP64__
#define __DARWIN_NULL (0L)
#else /* !__LP64__ */
#define __DARWIN_NULL 0
#endif /* __LP64__ */
#endif /* __GNUG__ */
#else /* ! __cplusplus */
#define __DARWIN_NULL ((void *)0)
#endif /* __cplusplus */

So, where does the nil
that gdb picks up at runtime come from? You can tell from the message gdb gives that nil
is the name of a variable located at that address:

(gdb) p nil
$1 = {<text variable, no debug info>} 0x20c49ba5da6428 <nil>
(gdb) i addr nil
Symbol "nil" is at 0x20c49ba5da6428 in a file compiled without debugging.

Its value, unsurprisingly, turns out to be 0
:

(gdb) p *(long *)nil
$2 = 0
(gdb) x/xg nil
0x20c49ba5da6428 <nil>: 0x0000000000000000

Where does this variable come from? GDB can tell us:

(gdb) i shared nil
  3 Foundation        F -                 init Y Y /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation at 0x20c49ba5bb2000 (offset 0x20c49ba5bb2000)

Indeed, when we check the symbols defined in Foundation, we find nil
:

$ nm -m /System/Library/Frameworks/Foundation.framework/Foundation | grep nil$
00000000001f4428 (__TEXT,__const) external _nil

阅读原文...


微信扫一扫,分享到朋友圈

Nil in gdb is not set to 0x0&quest;
0

Hello, buddy!

Node.js Top 10 Articles for the Past Month (v.June 2019)

上一篇

Vim/Neovim Arbitrary Code Execution Via Modelines (CVE-2002-1377, CVE-2016-1248, CVE-2019-1...

下一篇

评论已经被关闭。

插入图片

热门分类

往期推荐

Nil in gdb is not set to 0x0&quest;

长按储存图像,分享给朋友