最近使用openssl库时出了点问题,在调用EVP_CIPHER_CTX_init函数后外部调用函数返回时弹出“Stack around the variable "" was corrupted”错误。初步一看很明显,该错误是栈的问题,且是栈中的某个变量访问越界引起的。但在审阅代码时没有发现哪个地方有访问越界,无奈之下只能Debug了,通过调试发现在调用EVP_CIPHER_CTX_init函数时,传递的参数为EVP_CIPHER_CTX结构指针,该函数实现也很简单,只是使用memset将该结构体初始化为0,调试过程中发现函数调用之前的结构体大小为16,而函数体内该结构体为24,百思不得其解,莫名其妙。后来将最新的的openssl代码下载下来看了一下,发现自己当前使用的openssl静态库是最新代码编译的,而引用的头文件却是旧版本的openssl,这样问题就出来了,就的结构体大小更小,而新的库中结构体更大,由于传递的是指针,结构在EVP_CIPHER_CTX_init中调用memset时访问越界了,多设置了增大部分的栈空间,最终报错。
网上有相关的帖子的解决方法都是设置编译选项,但本人觉得一旦程序运行发生这个错误,那就说明程序代码存在问题,这时应该是查找真正问题而不是设置编译选项这种指标不治本的方法。