CPLSetErrorHandlerEx函数Bug
CPLSetErrorHandlerEx(gdal/gdal/port/cpl_error.cpp,当前github中代码)当前函数实现如下
CPLErrorHandler CPL_STDCALL CPLSetErrorHandlerEx( CPLErrorHandler pfnErrorHandlerNew, void* pUserData ) { CPLErrorContext *psCtx = CPLGetErrorContext(); if( psCtx == nullptr || IS_PREFEFINED_ERROR_CTX(psCtx) ) { fprintf(stderr, "CPLSetErrorHandlerEx() failed.\n"); return nullptr; } if( psCtx->psHandlerStack != nullptr ) { CPLDebug( "CPL", "CPLSetErrorHandler() called with an error handler on " "the local stack. New error handler will not be used " "immediately." ); } CPLErrorHandler pfnOldHandler = nullptr; { CPLMutexHolderD( &hErrorMutex ); pfnOldHandler = pfnErrorHandler; if( pfnErrorHandler == nullptr ) pfnErrorHandler = CPLDefaultErrorHandler; else pfnErrorHandler = pfnErrorHandlerNew; pErrorHandlerUserData = pUserData; } return pfnOldHandler; }
这里 if( pfnErrorHandler == nullptr )
这一句判断应该改为 if( pfnErrorHandlerNew== nullptr )
。
否则调用过一次CPLSetErrorHandlerEx(NULL,NULL)
后将无法再设置新的错误处理函数,必须再次调用使之变为CPLDefaultErrorHandler
后方能重新设置(如果没有重新设置,程序将出现段错误)。
自己编译GDAL的时候可以改过了,或者调用的时候传参别传错了即可。
对于这个问题,我已经提交给GDAL开发者了,这个问题已经修正了。CPLSetErrorHandler(): avoid later crashes when passing a null callback.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理