用C++实现了一部分CRT,不想写了,开源给大家参考参考~~~

redleaves 2010-06-04 10:52:06
如题... 下载地址

包里包含了VC9的可执行程序,我的开发环境,我实现的全部CRT代码,和测试代码.
实现了单线程的静态库.目前只支持可执行程序的入口.

实现的功能有:

1.CRT及C++的初始化,清理.
2.基本的内存管理(直接转发WIN32接口,我什么都没做^_^)
3.基本的文件流(只实现了一部分).
4.一部分字符串操作函数.
5.CRT的SEH支持.
6.C++异常支持.
7.对可变参数的支持.
8.CRT中long long/unsigned long long的支持函数.

基本上,CRT实现中的拌脚石都已经清除了.剩下的多半是体力活了...

其中,异常处理的实现部分是独此一份...
因为MS的CRT源代码里没有这些.网上也找不到相关实现代码.比较有参考意义.
VC的long long系列函数性能比较有问题.我在这里重新实现了这部分代码.
跑我的测试代码,性能是VC自带库的3倍.

另外,alloca要stack frame支持,但我还没搞清楚加什么修饰能强制让编译器在调用alloca时生成stack frame.
哪位大大知道,还请告知.不限编译器...(我搭的框架基本上是可以跨平台的)
...全文
858 59 打赏 收藏 举报
写回复
59 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
tyzqqq 2011-01-03
  • 打赏
  • 举报
回复
redleaves 2010-06-14
另外,补充一下,我的异常处理也有BUG....
改正代码如下:
static void _local_unwind2( VC_EXCEPTION_REGISTRATION* _Frame,  int argTryLevel ) {
int nTryLevel , nPrevTryLevel;
__try {
while( _Frame->trylevel != 0xFFFFFFFF ) {
nTryLevel = _Frame->trylevel;

if ( argTryLevel!=0xFFFFFFF && nTryLevel <= argTryLevel ) {
return;
}

_Frame->trylevel = nPrevTryLevel = _Frame->scopetable[nTryLevel].previousTryLevel;

if ( _Frame->scopetable[nTryLevel].lpfnFilter ) {
continue;
}

int tmp = (int)&_Frame->_ebp;
FARPROC handler = _Frame->scopetable[nTryLevel].lpfnHandler;
__asm {
mov eax, handler
push ebp
mov ebp, tmp
call eax
pop ebp
}
}

} __except(NestedExceptionHandler()) {}
}
  • 打赏
  • 举报
回复
redleaves 2010-06-14
我刚才看了下楼上给的那个代码.
他是hack的C库的异常处理.然后把所有的异常用他自己的方式来搞的.实现了SEH的异常处理.
C++异常只是把入口转向自己的处理函数,然后按SEH那样搞了一下.
不过C++异常处理的不对.如果异常的对象有一些继承关系.它的代码就不正确了...

我写的异常实现是按MS的CRT的方式来搞的.和那个代码路子不太一样...
  • 打赏
  • 举报
回复
sevencat 2010-06-14
http://www.codeproject.com/KB/exception/excv2.aspx
不知道这个算不算处理异常的代码...
  • 打赏
  • 举报
回复
redleaves 2010-06-14
应该不完全是重复工作吧?
至少.最起码VC处理C/C++异常以及SEH的代码.在网上肯定是没有的.
其实,就学习而言,重复前人的工作.是完全必要的.

不过我的主要目的是为了做个给自己用的C库...要不我在不同平台的代码要做无数的walkaround...
而且我还考虑让这个库的大多数基本功能做到完全的平台无关.这样,这个库就可以直接放到OS的内核里用了.这样,我在研究内核的时候,就有现成的C库用了^_^
  • 打赏
  • 举报
回复
linglongyouzhi 2010-06-14
为什么要重复工作呢
  • 打赏
  • 举报
回复
贪食蛇男 2010-06-14
牛B,受俺一拜,去看看。
  • 打赏
  • 举报
回复
sevencat 2010-06-14
http://www.uclibc.org/
  • 打赏
  • 举报
回复
sevencat 2010-06-14
支持楼主重发明轮子!!
http://www.codeproject.com/KB/library/tlibc.aspx
  • 打赏
  • 举报
回复
redleaves 2010-06-14
不是这个.你可以测试一下. 比如:
void a() {
...
void *p = alloca(10)
...
}
编译器会为a这个函数自动产生stack frame.
如果不调用alloca,那这个stack frame就有可能被优化掉.
也就是说,alloca这个函数在定义的时候,被赋予了一种属性,这个属性会指示编译器,在调用这个函数时,为调用者强制产生stack frame.不同的编译器,写法可能不太一样.但我没找到相关的资料.
  • 打赏
  • 举报
回复
老邓 2010-06-14
[Quote=引用 48 楼 redleaves 的回复:]

引用 45 楼 loaden 的回复:

引用 33 楼 redleaves 的回复:

为啥没人回答我最后的疑问?

啥疑问?
加什么修饰能强制让编译器在调用alloca时生成stack frame.
这个
[/Quote]
你问的是编译选项吧:防止缓冲区溢出?
不明白你的。试下/GL
  • 打赏
  • 举报
回复
redleaves 2010-06-14
[Quote=引用 45 楼 loaden 的回复:]

引用 33 楼 redleaves 的回复:

为啥没人回答我最后的疑问?

啥疑问?
[/Quote]加什么修饰能强制让编译器在调用alloca时生成stack frame.
这个
  • 打赏
  • 举报
回复
Eleven 2010-06-14
NX。。。
  • 打赏
  • 举报
回复
liutengfeigo 2010-06-14
  • 打赏
  • 举报
回复
老邓 2010-06-14
[Quote=引用 33 楼 redleaves 的回复:]

为啥没人回答我最后的疑问?
[/Quote]
啥疑问?
  • 打赏
  • 举报
回复
哦 顶一个
  • 打赏
  • 举报
回复
wh_xiao 2010-06-11
mark
  • 打赏
  • 举报
回复
Jerry_Lee01 2010-06-10
真厉害!佩服
  • 打赏
  • 举报
回复
只能围观。。
  • 打赏
  • 举报
回复
ddsaewq 2010-06-10
谢谢楼主啊
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
C++ 语言
加入

6.2w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
申请成为版主
帖子事件
创建了帖子
2010-06-04 10:52
社区公告
暂无公告