Sunday, April 10, 2016

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

Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts