30 lines
		
	
	
		
			873 B
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			30 lines
		
	
	
		
			873 B
		
	
	
	
		
			Python
		
	
	
	
| """
 | |
| Expose a race in the _warnings module, which is the C backend for the
 | |
| warnings module. The "_warnings" module tries to access attributes of the
 | |
| "warnings" module (because of the API it has to support), but doing so
 | |
| during interpreter shutdown is problematic. Specifically, the call to
 | |
| PyImport_GetModuleDict() in Python/_warnings.c:get_warnings_attr will
 | |
| abort() if the modules dict has already been cleaned up.
 | |
| 
 | |
| This crasher is timing-dependent, and more threads (NUM_THREADS) may be
 | |
| necessary to expose it reliably on different systems.
 | |
| """
 | |
| 
 | |
| import threading
 | |
| import warnings
 | |
| 
 | |
| NUM_THREADS = 10
 | |
| 
 | |
| class WarnOnDel(object):
 | |
|     def __del__(self):
 | |
|         warnings.warn("oh no something went wrong", UserWarning)
 | |
| 
 | |
| def do_work():
 | |
|     while True:
 | |
|         w = WarnOnDel()
 | |
| 
 | |
| for i in range(NUM_THREADS):
 | |
|     t = threading.Thread(target=do_work)
 | |
|     t.setDaemon(1)
 | |
|     t.start()
 |