Add defensive nil check for RoleManager in Check method

Co-authored-by: hsluoyz <3787410+hsluoyz@users.noreply.github.com>
diff --git a/detector/default_detector.go b/detector/default_detector.go
index 7afc7be..cd24232 100644
--- a/detector/default_detector.go
+++ b/detector/default_detector.go
@@ -40,6 +40,11 @@
 // It uses DFS to traverse the role graph and detect cycles.
 // Returns nil if no cycle is found, otherwise returns an error with a description of the cycle.
 func (d *DefaultDetector) Check(rm rbac.RoleManager) error {
+	// Defensive nil check to prevent runtime panics
+	if rm == nil {
+		return fmt.Errorf("role manager cannot be nil")
+	}
+
 	// Build the adjacency graph by exploring all roles
 	graph, err := d.buildGraph(rm)
 	if err != nil {
diff --git a/detector/default_detector_test.go b/detector/default_detector_test.go
index e7816d5..8f4ce55 100644
--- a/detector/default_detector_test.go
+++ b/detector/default_detector_test.go
@@ -22,6 +22,20 @@
 	defaultrolemanager "github.com/casbin/casbin/v3/rbac/default-role-manager"
 )
 
+func TestDefaultDetector_NilRoleManager(t *testing.T) {
+	detector := NewDefaultDetector()
+	err := detector.Check(nil)
+
+	if err == nil {
+		t.Error("Expected error for nil role manager, but got nil")
+	} else {
+		errMsg := err.Error()
+		if !strings.Contains(errMsg, "role manager cannot be nil") {
+			t.Errorf("Expected error message to contain 'role manager cannot be nil', got: %s", errMsg)
+		}
+	}
+}
+
 func TestDefaultDetector_NoCycle(t *testing.T) {
 	rm := defaultrolemanager.NewRoleManagerImpl(10)
 	_ = rm.AddLink("alice", "admin")