Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Register symbols as pointers in the examples
[simgrid.git] / examples / msg / mc / bugged1_liveness.c
index 09d374613f4f0ec66c342fbe16575917df3420c8..c5e9820a3bfc9264473a7041ead901b6f133073d 100644 (file)
 /* LTL property checked : G(r->F(cs)); (r=request of CS, cs=CS ok)            */
 /******************************************************************************/
 
+#ifdef GARBAGE_STACK
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#endif
+
 #include "msg/msg.h"
 #include "mc/mc.h"
 #include "xbt/automaton.h"
@@ -20,14 +26,16 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(bugged1_liveness, "my log messages");
 int r=0; 
 int cs=0;
 
-int predR(){
-  return r;
-}
-
-int predCS(){
-  return cs;
+#ifdef GARBAGE_STACK
+/** Do not use a clean stack */
+static void garbage_stack(void) {
+  const size_t size = 256;
+  int fd = open("/dev/urandom", O_RDONLY);
+  char foo[size];
+  read(fd, foo, size);
+  close(fd);
 }
-
+#endif
 
 int coordinator(int argc, char *argv[])
 {
@@ -84,7 +92,7 @@ int client(int argc, char *argv[])
 
   char *my_mailbox = xbt_strdup(argv[1]);
   msg_task_t grant = NULL, release = NULL;
-    
+
   while(1){
     XBT_INFO("Ask the request");
     MSG_task_send(MSG_task_create("request", 0, 1000, my_mailbox), "coordinator");
@@ -130,6 +138,17 @@ int client(int argc, char *argv[])
   return 0;
 }
 
+static int raw_client(int argc, char *argv[])
+{
+#ifdef GARBAGE_STACK
+  // At this point the stack of the callee (client) is probably filled with
+  // zeros and unitialized variables will contain 0. This call will place
+  // random byes in the stack of the callee:
+  garbage_stack();
+#endif
+  return client(argc, argv);
+}
+
 int main(int argc, char *argv[])
 {
 
@@ -138,15 +157,15 @@ int main(int argc, char *argv[])
   char **options = &argv[1];
 
   MSG_config("model-check/property","promela_bugged1_liveness");
-  MC_automaton_new_propositional_symbol("r", &predR);
-  MC_automaton_new_propositional_symbol("cs", &predCS);
+  MC_automaton_new_propositional_symbol_pointer("r", &r);
+  MC_automaton_new_propositional_symbol_pointer("cs", &cs);
 
   const char* platform_file = options[0];
   const char* application_file = options[1];
   
   MSG_create_environment(platform_file);
   MSG_function_register("coordinator", coordinator);
-  MSG_function_register("client", client);
+  MSG_function_register("client", raw_client);
   MSG_launch_application(application_file);
   MSG_main();