Check arguments & return types of main(). Abort in case of no match.
authorAnton Korobeynikov <asl@math.spbu.ru>
Sun, 3 Jun 2007 19:17:35 +0000 (19:17 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Sun, 3 Jun 2007 19:17:35 +0000 (19:17 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37404 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/ExecutionEngine.cpp

index d67fbb2ce609716487826d98fd973f5c4d117c49..36582ee2ed9e485dd4c13e42d836bf2340425c2f 100644 (file)
@@ -231,7 +231,39 @@ int ExecutionEngine::runFunctionAsMain(Function *Fn,
   std::vector<GenericValue> GVArgs;
   GenericValue GVArgc;
   GVArgc.IntVal = APInt(32, argv.size());
+
+  // Check main() type
   unsigned NumArgs = Fn->getFunctionType()->getNumParams();
+  const FunctionType *FTy = Fn->getFunctionType();
+  const Type* PPInt8Ty = PointerType::get(PointerType::get(Type::Int8Ty));
+  switch (NumArgs) {
+  case 3:
+   if (FTy->getParamType(2) != PPInt8Ty) {
+     cerr << "Invalid type for third argument of main() supplied\n";
+     abort();
+   }
+  case 2:
+   if (FTy->getParamType(1) != PPInt8Ty) {
+     cerr << "Invalid type for second argument of main() supplied\n";
+     abort();
+   }
+  case 1:
+   if (FTy->getParamType(0) != Type::Int32Ty) {
+     cerr << "Invalid type for first argument of main() supplied\n";
+     abort();
+   }
+  case 0:
+   if (FTy->getReturnType() != Type::Int32Ty &&
+       FTy->getReturnType() != Type::VoidTy) {
+     cerr << "Invalid return type of main() supplied\n";
+     abort();
+   }
+   break;
+  default:
+   cerr << "Invalid number of arguments of main() supplied\n";
+   abort();
+  }
+  
   if (NumArgs) {
     GVArgs.push_back(GVArgc); // Arg #0 = argc.
     if (NumArgs > 1) {