1.c语言怎么反编译源码?
2.CUnit生成测试程序
3.C语言10个经典开源项目
4.用C语言写的测测试计算器源代码
5.怎么通过EXE猜测C语言的源代码?
c语言怎么反编译源码?
需要准备的工具:电脑,反编译工具ILSpy。试源1、代码首先在百度上搜索下载反编译工具ILSpy,工具解压后如图,测测试双击.exe文件打开解压工具。试源e4a直播盒子源码
2、代码选择file选项,工具点击“打开”。测测试
3、试源接着选择要反编译的代码文件,点击“打开”。工具
4、测测试这是试源源码失效了会出现一个对话框,在这个对话框里面就可以看到源码了。代码
5、如果想把源码保存下来,自己在源码的基础上修改,点击"file"下的“Save code...”,保存即可。
6、如需用vs打开反编译后的源码,只需要打开这个.csproj文件即可。
CUnit生成测试程序
要生成测试程序,首先我们需要编写被测函数test.c:c
<!-- file: test.c --> int maxi(int i, int j) {return i > j ? i : j;
}
接下来,定义测试用例和测试包在testcase.c中:c
<!-- test cases and test suite functions --> void testIQJ() {CU_ASSERT_EQUAL(maxi(1, 1), 1);
CU_ASSERT_EQUAL(maxi(0, -0), 0);
}
void testIGJ() {CU_ASSERT_EQUAL(maxi(2, 1), 2);
CU_ASSERT_EQUAL(maxi(0, -1), 0);
CU_ASSERT_EQUAL(maxi(-1, -2), -1);
}
void testILJ() {CU_ASSERT_EQUAL(maxi(1, 2), 2);
CU_ASSERT_EQUAL(maxi(-1, 0), 0);
CU_ASSERT_EQUAL(maxi(-2, -1), -1);
}
CU_TestInfo testcases[] = {{ "Testing i equals j:", testIQJ},
{ "Testing i greater than j:", testIGJ},树形分类源码
{ "Testing i less than j:", testILJ},
{ NULL, NULL}
};
<!-- test suite initialization and cleanup functions --> int suite_success_init() { return 0; }int suite_success_clean() { return 0; }
CU_SuiteInfo suites[] = {{ "Testing the function maxi:", suite_success_init, suite_success_clean, testcases},
{ NULL, NULL}
};
然后,在Main.c中运行测试函数,这里包含了命令行选项的处理:c
<!-- Main.c for running the tests --> int main(int argc, char* argv[]) {// ... (command line options parsing and test execution)
}
最后,Makefile用于编译和清理:make
INC = -I/usr/local/include/CUnitLIB = -L/usr/local/lib/
all: func.c test_func.c run_test.c
gcc -o test $(INC) $(LIB) -lcunit $^
clean:rm -rf *.o test
将这些文件结合在一起,你就可以通过`make all`编译生成测试程序,然后运行`./test`来执行测试了。在运行时,可以通过命令行选项控制输出模式和错误处理行为。扩展资料
继Junit CppUnit的成功后, c语言环境下也出现了开发源码的溯源码毛尖白盒测试用例CUnit。CUnit以静态库的形式提供给用户使用,用户编写程序的时候直接链接此静态库就可以了。它提供了一个简单的单元测试框架,并且为常用的数据类型提供了丰富的断言语句支持。C语言个经典开源项目
C语言个经典开源项目
一、Webbench
Webbench是一款用于linux下的网站压测工具,通过模拟多个客户端并发访问指定URL,测试网站在高负载下的性能。最多支持3万并发连接,代码简洁,总共不到行。
下载链接: home.tiscali.cz/~cz...
二、CMockery
CMockery是min框架源码Google提供的一款轻量级的C语言单元测试框架,简洁且无需依赖其他开源包,对被测试代码的侵入性低。源代码不到3K行。
主要特点:免费开源、兼容旧版本编译器、无需C标准依赖。
下载链接: code.google.com/p/cmock...
三、Libev
Libev是一个基于epoll、kqueue等OS基础设施的高效事件驱动库,使用Reactor模式处理IO事件、定时器和信号,代码量少至4.版本的多行。
下载链接: software.schmorp.de/pkg...
四、Memcached
Memcached是一个用于动态Web应用的高性能分布式内存对象缓存系统,通过缓存数据和对象减少数据库读取次数,加速动态数据库驱动网站的速度。Memcached-1.4.7版本代码量在K行左右。
下载地址: a distributed memory object caching system
五、SQLite
SQLite是一个开源的嵌入式关系数据库引擎,实现自包容、零配置,支持事务的SQL数据库,代码量约3万行,大小K。
下载地址: SQLite Home Page
六、Redis
Redis是一个使用ANSI C编写的开源数据结构服务器,代码量相对较小(4.5w行),几乎不依赖其他库,大部分为单线程。
下载地址: Redis
七、Nginx
Nginx是一款高性能的HTTP和反向代理服务器,设计简洁、功能丰富,具有低系统资源消耗的特性。已发布多年,获得广泛好评。
下载地址: http://nginx.org/en/download.html
八、UNIXv6内核源代码
UNIX V6内核源代码约为1万行,适合初学者理解。与现代操作系统内核源代码(如Linux的万行)相比,UNIX V6源代码在可理解性上有优势。
下载地址: minnie.tuhs.org/cgi-bin...
九、NetBSD
NetBSD是一个免费的、高度移植性的UNIX-like操作系统,支持多种平台,设计简洁、代码规范,具有多项先进特性,广受好评。
下载地址: The NetBSD Project
十、Tinyhttpd
Tinyhttpd是一个超轻量型HTTP服务器,全部代码仅行(包括注释),附带一个简单的客户端,可用于理解HTTP服务器的基本原理。
下载链接: Tiny HTTPd
用C语言写的计算器源代码
#include<stdio.h>
#include<iostream.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
typedef float DataType;
typedef struct
{
DataType *data;
int max;
int top;
}Stack;
void SetStack(Stack *S,int n)
{
S->data=(DataType*)malloc(n*sizeof(DataType));
if(S->data==NULL)
{
printf("overflow");
exit(1);
}
S->max=n;
S->top=-1;
}
void FreeStack(Stack *S)
{
free(S->data);
}
int StackEmpty(Stack *S)
{
if(S->top==-1)
return(1);
return(0);
}
DataType Peek(Stack *S)
{
if(S->top==S->max-1)
{
printf("Stack is empty!\n");
exit(1);
}
return(S->data[S->top]);
}
void Push(Stack *S,DataType item)
{
if(S->top==S->max-1)
{
printf("Stack is full!\n");
exit(1);
}
S->top++;
S->data[S->top]=item;
}
DataType Pop(Stack *S)
{
if(S->top==-1)
{
printf("Pop an empty stack!\n");
exit(1);
}
S->top--;
return(S->data[S->top+1]);
}
typedef struct
{
char op;
int inputprecedence;
int stackprecedence;
}DataType1;
typedef struct
{
DataType1 *data;
int max;
int top;
}Stack1;
void SetStack1(Stack1 *S,int n)
{
S->data=(DataType1*)malloc(n*sizeof(DataType1));
if(S->data==NULL)
{
printf("overflow");
exit(1);
}
S->max=n;
S->top=-1;
}
void FreeStack1(Stack1 *S)
{
free(S->data);
}
int StackEmpty1(Stack1 *S)
{
if(S->top==-1)
return(1);
return(0);
}
DataType1 Peek1(Stack1 *S)
{
if(S->top==S->max-1)
{
printf("Stack1 is empty!\n");
exit(1);
}
return(S->data[S->top]);
}
void Push1(Stack1 *S,DataType1 item)
{
if(S->top==S->max-1)
{
printf("Stack is full!\n");
exit(1);
}
S->top++;
S->data[S->top]=item;
}
DataType1 Pop1(Stack1 *S)
{
if(S->top==-1)
{
printf("Pop an empty stack!\n");
exit(1);
}
S->top--;
return(S->data[S->top+1]);
}
DataType1 MathOptr(char ch)
{
DataType1 optr;
optr.op=ch;
switch(optr.op)
{
case'+':
case'-':
optr.inputprecedence=1;
optr.stackprecedence=1;
break;
case'*':
case'/':
optr.inputprecedence=2;
optr.stackprecedence=2;
break;
case'(':
optr.inputprecedence=3;
optr.stackprecedence=-1;
break;
case')':
optr.inputprecedence=0;
optr.stackprecedence=0;
break;
}
return(optr);
}
void Evaluate(Stack *OpndStack,DataType1 optr)
{
DataType opnd1,opnd2;
opnd1=Pop(OpndStack);
opnd2=Pop(OpndStack);
switch(optr.op)
{
case'+':
Push(OpndStack,opnd2+opnd1);
break;
case'-':
Push(OpndStack,opnd2-opnd1);
break;
case'*':
Push(OpndStack,opnd2*opnd1);
break;
case'/':
Push(OpndStack,opnd2/opnd1);
break;
}
}
int isoptr(char ch)
{
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='(')
return(1);
return(0);
}
void Infix(char *str)
{
int i,k,n=strlen(str);
char ch,numstr[];
DataType opnd;
DataType1 optr;
Stack OpndStack;
Stack1 OptrStack;
SetStack(&OpndStack,n);
SetStack1(&OptrStack,n);
k=0;
ch=str[k];
while(ch!='=')
if(isdigit(ch)||ch=='.')
{
for(i=0;isdigit(ch)||ch=='.';i++)
{
numstr[i]=ch;
k++;
ch=str[k];
}
numstr[i]='\0';
opnd= atof(numstr);
Push(&OpndStack,opnd);
}
else
if(isoptr(ch))
{
optr=MathOptr(ch);
while(Peek1(&OptrStack).stackprecedence>=optr.inputprecedence)
Evaluate(&OpndStack,Pop1(&OptrStack));
Push1(&OptrStack,optr);
k++;
ch=str[k];
}
else if(ch==')')
{
optr=MathOptr(ch);
while(Peek1(&OptrStack).stackprecedence>=optr.inputprecedence)
Evaluate(&OpndStack,Pop1(&OptrStack));
Pop1(&OptrStack);
k++;
ch=str[k];
}
while(!StackEmpty1(&OptrStack))
Evaluate(&OpndStack,Pop1(&OptrStack));
opnd=Pop(&OpndStack);
cout<<"你输入表达式的计算结果为"<<endl;
printf("%-6.2f\n",opnd);
FreeStack(&OpndStack);
FreeStack1(&OptrStack);
}
void main()
{
cout<<"请输入你要计算的表达式,并以“=”号结束。"<<endl;
char str[];
gets(str);
Infix(str);
=================================================================
哈哈!给分吧!
怎么通过EXE猜测C语言的源代码?
如果是没加壳的EXE文件的话,基本有两种工具:
1、wdasm 静态反汇编工具,反汇编出来的是汇编代码,对汇编语言理解非常深刻的高手可能大概可以理解出某个函数内部的大概算法和思路。这种程度的,自己用汇编语言写个程序什么的估计也很轻松了。
2、OllyDBG动态调试工具,这个相对上面的静态反汇编工具属于新工具,顾名思义,可以动态一步一步跟踪调试EXE文件执行的汇编代码。优点是可以动态的看到当前程序运行状态,包括内存中的数据,寄存器里面的当前数值等。
其他工具就不太了解了。
2024-12-22 13:59
2024-12-22 13:55
2024-12-22 13:30
2024-12-22 13:07
2024-12-22 13:03
2024-12-22 11:38