Why Doesn't Get Error Anymore | tech::interview



Why Doesn't Get Error Anymore | tech::interview

There is a code with a runtime error. We add printf to display the value of a variable and we don't get the runtime error anymore. explain what the reason can be.

这也是一道出现过多次的Google面试题。CareerCup上提供了一段很有意思的C语言代码,可以视为此问题的重现:

1
2
3
const char* res = (char*)memchr("Syshsh Pavlik", 'p', 16);
printf("%p\n", res); // uncomment this line and see what happens
int x = !*(int*)res;

在大部分平台上,这段代码应该是正常执行的,但是注释掉printf,程序就会发生runtime error。
首先先回顾下memchr的作用:

1
void *memchr(const void *ptr, int value, size_t num);

这个C函数的功能是在ptr开始,长度为num字节的范围内找到第一个值为value的地址并返回。如果找不到,则返回NULL。
在上面的例子中,"Syshsh Pavlik"这段长度不足16的常量字符串通常存储在程序的数据段中,假设它所在的内存的后面都是空的,那么这个memchr会返回NULL,也就意味着!*(int*)res的执行必然会触发空指针访问。
但是如果在后面加一行printf,因为printf的第一个参数我们也传入了常量字符串,"Syshsh Pavlik\0"的后面可能是"%p\n"(当然这个是取决于运行环境和编译器的)。所以在我的平台上,加上printf后memchr返回的地址是指向"p\n"的。

对于C/C++这类内存可以灵活掌控的语言来说,这个问题并不算特别罕见。比如错误的static_cast转换一个对象后,在调用这个指针的成员,是可能触发一些未知错误的。在加上printf后,改变了内存布局,有可能这个runtime error就不会触发了。

当然,对于其他很多语言,是有lazy loading/evaluation机制的。也就是一个变量直到被使用的时候才会被实例化。


Read full article from Why Doesn't Get Error Anymore | tech::interview


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts